From 38721994a0dd1589723b4a572de9c492a75337b6 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Sat, 24 Oct 2020 12:57:34 +0200 Subject: [PATCH 01/33] feat!: add support for CommitStats Adds support for returning CommitStats from read/write transactions. --- .kokoro/release/publish_javadoc.sh | 2 +- CODE_OF_CONDUCT.md | 7 +- .../clirr-ignored-differences.xml | 23 + .../com/google/cloud/spanner/AsyncRunner.java | 10 +- .../google/cloud/spanner/AsyncRunnerImpl.java | 30 +- .../spanner/AsyncTransactionManager.java | 3 + .../spanner/AsyncTransactionManagerImpl.java | 34 +- .../google/cloud/spanner/CommitResponse.java | 25 +- .../com/google/cloud/spanner/CommitStats.java | 66 + .../google/cloud/spanner/DatabaseClient.java | 8 +- .../cloud/spanner/DatabaseClientImpl.java | 52 +- .../com/google/cloud/spanner/Options.java | 39 +- .../com/google/cloud/spanner/SessionImpl.java | 58 +- .../com/google/cloud/spanner/SessionPool.java | 147 ++- .../SessionPoolAsyncTransactionManager.java | 27 +- .../cloud/spanner/TransactionManager.java | 3 + .../cloud/spanner/TransactionManagerImpl.java | 17 +- .../cloud/spanner/TransactionRunner.java | 3 + .../cloud/spanner/TransactionRunnerImpl.java | 58 +- .../AsyncTransactionManagerImplTest.java | 61 + .../spanner/AsyncTransactionManagerTest.java | 26 + .../cloud/spanner/DatabaseClientImplTest.java | 93 ++ .../cloud/spanner/MockSpannerServiceImpl.java | 21 +- .../google/cloud/spanner/SessionPoolTest.java | 32 +- .../spanner/TransactionContextImplTest.java | 34 + .../spanner/TransactionManagerImplTest.java | 42 +- .../spanner/TransactionRunnerImplTest.java | 12 +- .../connection/ConnectionImplTest.java | 27 +- .../connection/ReadWriteTransactionTest.java | 12 +- .../connection/SingleUseTransactionTest.java | 31 +- .../cloud/spanner/it/ITAsyncAPITest.java | 83 +- .../spanner/it/ITTransactionManagerTest.java | 27 + .../cloud/spanner/it/ITTransactionTest.java | 19 + .../google/cloud/spanner/it/ITWriteTest.java | 38 + .../com/google/spanner/v1/CommitRequest.java | 98 ++ .../spanner/v1/CommitRequestOrBuilder.java | 15 + .../com/google/spanner/v1/CommitResponse.java | 1163 +++++++++++++++++ .../spanner/v1/CommitResponseOrBuilder.java | 41 + .../com/google/spanner/v1/SpannerProto.java | 410 +++--- .../proto/google/spanner/v1/spanner.proto | 19 + synth.metadata | 305 +---- 41 files changed, 2490 insertions(+), 731 deletions(-) create mode 100644 google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java create mode 100644 google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java diff --git a/.kokoro/release/publish_javadoc.sh b/.kokoro/release/publish_javadoc.sh index fbd48654eeb..0219a65374c 100755 --- a/.kokoro/release/publish_javadoc.sh +++ b/.kokoro/release/publish_javadoc.sh @@ -62,7 +62,7 @@ popd # V2 mvn clean site -B -q -Ddevsite.template="${KOKORO_GFILE_DIR}/java/" -pushd target/devsite +pushd target/devsite/reference # create metadata python3 -m docuploader create-metadata \ diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 6b2238bb75e..2add2547a81 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,3 +1,4 @@ + # Code of Conduct ## Our Pledge @@ -69,12 +70,12 @@ dispute. If you are unable to resolve the matter for any reason, or if the behavior is threatening or harassing, report it. We are dedicated to providing an environment where participants feel welcome and safe. -Reports should be directed to *[PROJECT STEWARD NAME(s) AND EMAIL(s)]*, the -Project Steward(s) for *[PROJECT NAME]*. It is the Project Steward’s duty to +Reports should be directed to *googleapis-stewards@google.com*, the +Project Steward(s) for *Google Cloud Client Libraries*. It is the Project Steward’s duty to receive and address reported violations of the code of conduct. They will then work with a committee consisting of representatives from the Open Source Programs Office and the Google Open Source Strategy team. If for any reason you -are uncomfortable reaching out the Project Steward, please email +are uncomfortable reaching out to the Project Steward, please email opensource@google.com. We will investigate every complaint, but you may not receive a direct response. diff --git a/google-cloud-spanner/clirr-ignored-differences.xml b/google-cloud-spanner/clirr-ignored-differences.xml index 3968118b1c7..55ff76adb72 100644 --- a/google-cloud-spanner/clirr-ignored-differences.xml +++ b/google-cloud-spanner/clirr-ignored-differences.xml @@ -406,4 +406,27 @@ com/google/cloud/spanner/AbstractLazyInitializer java.lang.Object initialize() + + + + 7012 + com/google/cloud/spanner/AsyncTransactionManager + com.google.api.core.ApiFuture getCommitResponse() + + + 7012 + com/google/cloud/spanner/AsyncRunner + com.google.api.core.ApiFuture getCommitResponse() + + + 7012 + com/google/cloud/spanner/TransactionManager + com.google.cloud.spanner.CommitResponse getCommitResponse() + + + 7012 + com/google/cloud/spanner/TransactionRunner + com.google.cloud.spanner.CommitResponse getCommitResponse() + + diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunner.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunner.java index 3cae49e65b4..f1a5b7feeee 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunner.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunner.java @@ -52,8 +52,14 @@ interface AsyncWork { ApiFuture runAsync(AsyncWork work, Executor executor); /** - * Returns the timestamp at which the transaction committed. {@link ApiFuture#get()} will throw an - * {@link ExecutionException} if the transaction did not commit. + * Returns the timestamp at which the transaction committed. The {@link ApiFuture#get()} will + * throw an {@link ExecutionException} if the transaction did not commit. */ ApiFuture getCommitTimestamp(); + + /** + * Returns the {@link CommitResponse} of this transaction. The {@link ApiFuture#get()} will throw + * an {@link ExecutionException} if the transaction did not commit. + */ + ApiFuture getCommitResponse(); } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunnerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunnerImpl.java index 5b83402919e..85099d83fd2 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunnerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunnerImpl.java @@ -16,19 +16,23 @@ package com.google.cloud.spanner; +import com.google.api.core.ApiFunction; import com.google.api.core.ApiFuture; +import com.google.api.core.ApiFutures; import com.google.api.core.SettableApiFuture; import com.google.cloud.Timestamp; import com.google.cloud.spanner.TransactionRunner.TransactionCallable; +import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.MoreExecutors; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; class AsyncRunnerImpl implements AsyncRunner { private final TransactionRunnerImpl delegate; - private final SettableApiFuture commitTimestamp = SettableApiFuture.create(); + private final SettableApiFuture commitResponse = SettableApiFuture.create(); AsyncRunnerImpl(TransactionRunnerImpl delegate) { - this.delegate = delegate; + this.delegate = Preconditions.checkNotNull(delegate); } @Override @@ -43,7 +47,7 @@ public void run() { } catch (Throwable t) { res.setException(t); } finally { - setCommitTimestamp(); + setCommitResponse(); } } }); @@ -66,16 +70,28 @@ public R run(TransactionContext transaction) throws Exception { }); } - private void setCommitTimestamp() { + private void setCommitResponse() { try { - commitTimestamp.set(delegate.getCommitTimestamp()); + commitResponse.set(delegate.getCommitResponse()); } catch (Throwable t) { - commitTimestamp.setException(t); + commitResponse.setException(t); } } @Override public ApiFuture getCommitTimestamp() { - return commitTimestamp; + return ApiFutures.transform( + commitResponse, + new ApiFunction() { + @Override + public Timestamp apply(CommitResponse input) { + return input.getCommitTimestamp(); + } + }, + MoreExecutors.directExecutor()); + } + + public ApiFuture getCommitResponse() { + return commitResponse; } } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManager.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManager.java index 02d4a9dbd23..a4741dd3293 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManager.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManager.java @@ -191,6 +191,9 @@ public interface AsyncTransactionFunction { /** Returns the state of the transaction. */ TransactionState getState(); + /** Returns the {@link CommitResponse} of this transaction. */ + ApiFuture getCommitResponse(); + /** * Closes the manager. If there is an active transaction, it will be rolled back. Underlying * session will be released back to the session pool. diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManagerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManagerImpl.java index 2ba66d0c864..0acc1eb2bd6 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManagerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManagerImpl.java @@ -17,6 +17,7 @@ package com.google.cloud.spanner; import com.google.api.core.ApiAsyncFunction; +import com.google.api.core.ApiFunction; import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutureCallback; import com.google.api.core.ApiFutures; @@ -40,14 +41,16 @@ final class AsyncTransactionManagerImpl private final SessionImpl session; private Span span; + private final Options options; private TransactionRunnerImpl.TransactionContextImpl txn; private TransactionState txnState; - private final SettableApiFuture commitTimestamp = SettableApiFuture.create(); + private final SettableApiFuture commitResponse = SettableApiFuture.create(); - AsyncTransactionManagerImpl(SessionImpl session, Span span) { + AsyncTransactionManagerImpl(SessionImpl session, Span span, Options options) { this.session = session; this.span = span; + this.options = options; } @Override @@ -80,7 +83,7 @@ public TransactionContextFutureImpl beginAsync() { private ApiFuture internalBeginAsync(boolean firstAttempt) { txnState = TransactionState.STARTED; - txn = session.newTransaction(); + txn = session.newTransaction(options); if (firstAttempt) { session.setActive(this); } @@ -126,28 +129,36 @@ public ApiFuture commitAsync() { SpannerExceptionFactory.newSpannerException( ErrorCode.ABORTED, "Transaction already aborted")); } - ApiFuture res = txn.commitAsync(); + ApiFuture res = txn.commitAsync(); txnState = TransactionState.COMMITTED; ApiFutures.addCallback( res, - new ApiFutureCallback() { + new ApiFutureCallback() { @Override public void onFailure(Throwable t) { if (t instanceof AbortedException) { txnState = TransactionState.ABORTED; } else { txnState = TransactionState.COMMIT_FAILED; - commitTimestamp.setException(t); + commitResponse.setException(t); } } @Override - public void onSuccess(Timestamp result) { - commitTimestamp.set(result); + public void onSuccess(CommitResponse result) { + commitResponse.set(result); + } + }, + MoreExecutors.directExecutor()); + return ApiFutures.transform( + res, + new ApiFunction() { + @Override + public Timestamp apply(CommitResponse input) { + return input.getCommitTimestamp(); } }, MoreExecutors.directExecutor()); - return res; } @Override @@ -184,6 +195,11 @@ public TransactionState getState() { return txnState; } + @Override + public ApiFuture getCommitResponse() { + return commitResponse; + } + @Override public void invalidate() { if (txnState == TransactionState.STARTED || txnState == null) { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java index dd5534d7c35..80bfc42e9e8 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java @@ -17,20 +17,31 @@ package com.google.cloud.spanner; import com.google.cloud.Timestamp; +import com.google.common.base.Preconditions; import java.util.Objects; /** Represents a response from a commit operation. */ public class CommitResponse { - private final Timestamp commitTimestamp; + private final com.google.spanner.v1.CommitResponse proto; - public CommitResponse(Timestamp commitTimestamp) { - this.commitTimestamp = commitTimestamp; + CommitResponse(com.google.spanner.v1.CommitResponse proto) { + this.proto = proto; } - /** Returns a {@link Timestamp} representing the commit time of the write operation. */ + /** Returns a {@link Timestamp} representing the commit time of the transaction. */ public Timestamp getCommitTimestamp() { - return commitTimestamp; + return Timestamp.fromProto(proto.getCommitTimestamp()); + } + + /** + * Commit statistics are returned by a read/write transaction if specifically requested by passing + * in {@link Options#commitStats()} to the transaction. + */ + public CommitStats getCommitStats() { + Preconditions.checkState( + proto.hasCommitStats(), "The CommitResponse does not contain any commit statistics."); + return CommitStats.fromProto(proto.getCommitStats()); } @Override @@ -42,11 +53,11 @@ public boolean equals(Object o) { return false; } CommitResponse that = (CommitResponse) o; - return Objects.equals(commitTimestamp, that.commitTimestamp); + return Objects.equals(proto, that.proto); } @Override public int hashCode() { - return Objects.hash(commitTimestamp); + return Objects.hash(proto); } } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java new file mode 100644 index 00000000000..ab24c9907e4 --- /dev/null +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java @@ -0,0 +1,66 @@ +/* + * Copyright 2020 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; + +import com.google.common.base.Preconditions; +import org.threeten.bp.Duration; +import org.threeten.bp.temporal.ChronoUnit; + +/** + * Commit statistics are returned by a read/write transaction if specifically requested by passing + * in {@link Options#commitStats()} to the transaction. + */ +public class CommitStats { + private final long mutationCount; + private final Duration overloadDelay; + + private CommitStats(long mutationCount, Duration overloadDelay) { + this.mutationCount = mutationCount; + this.overloadDelay = overloadDelay; + } + + static CommitStats fromProto(com.google.spanner.v1.CommitResponse.CommitStats proto) { + Preconditions.checkNotNull(proto); + return new CommitStats( + proto.getMutationCount(), + Duration.of(proto.getOverloadDelay().getSeconds(), ChronoUnit.SECONDS) + .plusNanos(proto.getOverloadDelay().getNanos())); + } + + /** + * The number of mutations that were executed by the transaction. Insert and update operations + * count with the multiplicity of the number of columns they affect. For example, inserting a new + * record may count as five mutations, if values are inserted into five columns. Delete and delete + * range operations count as one mutation regardless of the number of columns affected. Deleting a + * row from a parent table that has the ON DELETE CASCADE annotation is also counted as one + * mutation regardless of the number of interleaved child rows present. The exception to this is + * if there are secondary indexes defined on rows being deleted, then the changes to the secondary + * indexes will be counted individually. For example, if a table has 2 secondary indexes, deleting + * a range of rows in the table will count as 1 mutation for the table, plus 2 mutations for each + * row that is deleted because the rows in the secondary index might be scattered over the + * key-space, making it impossible for Cloud Spanner to call a single delete range operation on + * the secondary indexes. Secondary indexes include the foreign keys backing indexes. + */ + public long getMutationCount() { + return mutationCount; + } + + /** The duration that the commit was delayed due to overloaded servers. */ + public Duration getOverloadDelay() { + return overloadDelay; + } +} diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClient.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClient.java index dc1f2a80c7f..de4f9b95805 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClient.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClient.java @@ -308,7 +308,7 @@ CommitResponse writeAtLeastOnceWithOptions( * }); * */ - TransactionRunner readWriteTransaction(); + TransactionRunner readWriteTransaction(TransactionOption... options); /** * Returns a transaction manager which allows manual management of transaction lifecycle. This API @@ -338,7 +338,7 @@ CommitResponse writeAtLeastOnceWithOptions( * } * } */ - TransactionManager transactionManager(); + TransactionManager transactionManager(TransactionOption... options); /** * Returns an asynchronous transaction runner for executing a single logical transaction with @@ -371,7 +371,7 @@ CommitResponse writeAtLeastOnceWithOptions( * executor); * */ - AsyncRunner runAsync(); + AsyncRunner runAsync(TransactionOption... options); /** * Returns an asynchronous transaction manager which allows manual management of transaction @@ -459,7 +459,7 @@ CommitResponse writeAtLeastOnceWithOptions( * } * } */ - AsyncTransactionManager transactionManagerAsync(); + AsyncTransactionManager transactionManagerAsync(TransactionOption... options); /** * Returns the lower bound of rows modified by this DML statement. diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java index a6dd90713b7..217da8851b3 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java @@ -54,13 +54,20 @@ PooledSessionFuture getSession() { @Override public Timestamp write(final Iterable mutations) throws SpannerException { + return writeWithOptions(mutations).getCommitTimestamp(); + } + + @Override + public CommitResponse writeWithOptions( + final Iterable mutations, final TransactionOption... options) + throws SpannerException { Span span = tracer.spanBuilder(READ_WRITE_TRANSACTION).startSpan(); try (Scope s = tracer.withSpan(span)) { return runWithSessionRetry( - new Function() { + new Function() { @Override - public Timestamp apply(Session session) { - return session.write(mutations); + public CommitResponse apply(Session session) { + return session.writeWithOptions(mutations, options); } }); } catch (RuntimeException e) { @@ -72,21 +79,21 @@ public Timestamp apply(Session session) { } @Override - public CommitResponse writeWithOptions(Iterable mutations, TransactionOption... options) - throws SpannerException { - final Timestamp commitTimestamp = write(mutations); - return new CommitResponse(commitTimestamp); + public Timestamp writeAtLeastOnce(final Iterable mutations) throws SpannerException { + return writeAtLeastOnceWithOptions(mutations).getCommitTimestamp(); } @Override - public Timestamp writeAtLeastOnce(final Iterable mutations) throws SpannerException { + public CommitResponse writeAtLeastOnceWithOptions( + final Iterable mutations, final TransactionOption... options) + throws SpannerException { Span span = tracer.spanBuilder(READ_WRITE_TRANSACTION).startSpan(); try (Scope s = tracer.withSpan(span)) { return runWithSessionRetry( - new Function() { + new Function() { @Override - public Timestamp apply(Session session) { - return session.writeAtLeastOnce(mutations); + public CommitResponse apply(Session session) { + return session.writeAtLeastOnceWithOptions(mutations, options); } }); } catch (RuntimeException e) { @@ -97,13 +104,6 @@ public Timestamp apply(Session session) { } } - @Override - public CommitResponse writeAtLeastOnceWithOptions( - Iterable mutations, TransactionOption... options) throws SpannerException { - final Timestamp commitTimestamp = writeAtLeastOnce(mutations); - return new CommitResponse(commitTimestamp); - } - @Override public ReadContext singleUse() { Span span = tracer.spanBuilder(READ_ONLY_TRANSACTION).startSpan(); @@ -171,10 +171,10 @@ public ReadOnlyTransaction readOnlyTransaction(TimestampBound bound) { } @Override - public TransactionRunner readWriteTransaction() { + public TransactionRunner readWriteTransaction(TransactionOption... options) { Span span = tracer.spanBuilder(READ_WRITE_TRANSACTION).startSpan(); try (Scope s = tracer.withSpan(span)) { - return getSession().readWriteTransaction(); + return getSession().readWriteTransaction(options); } catch (RuntimeException e) { TraceUtil.endSpanWithFailure(span, e); throw e; @@ -184,10 +184,10 @@ public TransactionRunner readWriteTransaction() { } @Override - public TransactionManager transactionManager() { + public TransactionManager transactionManager(TransactionOption... options) { Span span = tracer.spanBuilder(READ_WRITE_TRANSACTION).startSpan(); try (Scope s = tracer.withSpan(span)) { - return getSession().transactionManager(); + return getSession().transactionManager(options); } catch (RuntimeException e) { TraceUtil.endSpanWithFailure(span, e); throw e; @@ -195,10 +195,10 @@ public TransactionManager transactionManager() { } @Override - public AsyncRunner runAsync() { + public AsyncRunner runAsync(TransactionOption... options) { Span span = tracer.spanBuilder(READ_WRITE_TRANSACTION).startSpan(); try (Scope s = tracer.withSpan(span)) { - return getSession().runAsync(); + return getSession().runAsync(options); } catch (RuntimeException e) { TraceUtil.endSpanWithFailure(span, e); throw e; @@ -206,10 +206,10 @@ public AsyncRunner runAsync() { } @Override - public AsyncTransactionManager transactionManagerAsync() { + public AsyncTransactionManager transactionManagerAsync(TransactionOption... options) { Span span = tracer.spanBuilder(READ_WRITE_TRANSACTION).startSpan(); try (Scope s = tracer.withSpan(span)) { - return getSession().transactionManagerAsync(); + return getSession().transactionManagerAsync(options); } catch (RuntimeException e) { TraceUtil.endSpanWithFailure(span, e); throw e; diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java index 217d81b886e..f965a8da7fe 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java @@ -39,6 +39,11 @@ public interface TransactionOption {} /** Marker interface to mark options applicable to list operations in admin API. */ public interface ListOption {} + /** Specifying this will cause the transaction to request {@link CommitStats} from the backend. */ + public static TransactionOption commitStats() { + return COMMIT_STATS_OPTION; + } + /** * Specifying this will cause the read to yield at most this many rows. This should be greater * than 0. @@ -109,6 +114,16 @@ public static ListOption filter(String filter) { return new FilterOption(filter); } + /** Option to request {@link CommitStats} for read/write transactions. */ + static final class CommitStatsOption extends InternalOption implements TransactionOption { + @Override + void appendToOptions(Options options) { + options.withCommitStats = true; + } + } + + static final CommitStatsOption COMMIT_STATS_OPTION = new CommitStatsOption(); + /** Option pertaining to flow control. */ static final class FlowControlOption extends InternalOption implements ReadAndQueryOption { final int prefetchChunks; @@ -136,6 +151,7 @@ void appendToOptions(Options options) { } } + private boolean withCommitStats; private Long limit; private Integer prefetchChunks; private Integer bufferRows; @@ -146,6 +162,10 @@ void appendToOptions(Options options) { // Construction is via factory methods below. private Options() {} + boolean withCommitStats() { + return withCommitStats; + } + boolean hasLimit() { return limit != null; } @@ -197,6 +217,9 @@ String filter() { @Override public String toString() { StringBuilder b = new StringBuilder(); + if (withCommitStats) { + b.append("withCommitStats: ").append(withCommitStats).append(' '); + } if (limit != null) { b.append("limit: ").append(limit).append(' '); } @@ -227,7 +250,8 @@ public boolean equals(Object o) { } Options that = (Options) o; - return (!hasLimit() && !that.hasLimit() + return Objects.equals(withCommitStats, that.withCommitStats) + && (!hasLimit() && !that.hasLimit() || hasLimit() && that.hasLimit() && Objects.equals(limit(), that.limit())) && (!hasPrefetchChunks() && !that.hasPrefetchChunks() || hasPrefetchChunks() @@ -246,6 +270,9 @@ public boolean equals(Object o) { @Override public int hashCode() { int result = 31; + if (withCommitStats) { + result = 31 * result + Boolean.valueOf(withCommitStats).hashCode(); + } if (limit != null) { result = 31 * result + limit.hashCode(); } @@ -267,6 +294,16 @@ public int hashCode() { return result; } + static Options fromTransactionOptions(TransactionOption... options) { + Options transactionOptions = new Options(); + for (TransactionOption option : options) { + if (option instanceof InternalOption) { + ((InternalOption) option).appendToOptions(transactionOptions); + } + } + return transactionOptions; + } + static Options fromReadOptions(ReadOption... options) { Options readOptions = new Options(); for (ReadOption option : options) { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java index 971dfc2ab1d..34885ca0a6f 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java @@ -123,7 +123,13 @@ public long executePartitionedUpdate(Statement stmt) { @Override public Timestamp write(Iterable mutations) throws SpannerException { - TransactionRunner runner = readWriteTransaction(); + return writeWithOptions(mutations).getCommitTimestamp(); + } + + @Override + public CommitResponse writeWithOptions(Iterable mutations, TransactionOption... options) + throws SpannerException { + TransactionRunner runner = readWriteTransaction(options); final Collection finalMutations = mutations instanceof java.util.Collection ? (Collection) mutations @@ -136,24 +142,25 @@ public Void run(TransactionContext ctx) { return null; } }); - return runner.getCommitTimestamp(); + return runner.getCommitResponse(); } @Override - public CommitResponse writeWithOptions(Iterable mutations, TransactionOption... options) - throws SpannerException { - final Timestamp commitTimestamp = write(mutations); - return new CommitResponse(commitTimestamp); + public Timestamp writeAtLeastOnce(Iterable mutations) throws SpannerException { + return writeAtLeastOnceWithOptions(mutations).getCommitTimestamp(); } @Override - public Timestamp writeAtLeastOnce(Iterable mutations) throws SpannerException { + public CommitResponse writeAtLeastOnceWithOptions( + final Iterable mutations, final TransactionOption... options) + throws SpannerException { setActive(null); List mutationsProto = new ArrayList<>(); Mutation.toProto(mutations, mutationsProto); final CommitRequest request = CommitRequest.newBuilder() .setSession(name) + .setReturnCommitStats(Options.fromTransactionOptions(options).withCommitStats()) .addAllMutations(mutationsProto) .setSingleUseTransaction( TransactionOptions.newBuilder() @@ -161,12 +168,12 @@ public Timestamp writeAtLeastOnce(Iterable mutations) throws SpannerEx .build(); Span span = tracer.spanBuilder(SpannerImpl.COMMIT).startSpan(); try (Scope s = tracer.withSpan(span)) { - com.google.spanner.v1.CommitResponse response = spanner.getRpc().commit(request, options); - Timestamp t = Timestamp.fromProto(response.getCommitTimestamp()); - return t; + com.google.spanner.v1.CommitResponse response = + spanner.getRpc().commit(request, this.options); + return new CommitResponse(response); } catch (IllegalArgumentException e) { TraceUtil.setWithFailure(span, e); - throw newSpannerException(ErrorCode.INTERNAL, "Could not parse commit timestamp", e); + throw newSpannerException(ErrorCode.INTERNAL, "Could not parse commit response", e); } catch (RuntimeException e) { TraceUtil.setWithFailure(span, e); throw e; @@ -175,13 +182,6 @@ public Timestamp writeAtLeastOnce(Iterable mutations) throws SpannerEx } } - @Override - public CommitResponse writeAtLeastOnceWithOptions( - Iterable mutations, TransactionOption... options) throws SpannerException { - final Timestamp commitTimestamp = writeAtLeastOnce(mutations); - return new CommitResponse(commitTimestamp); - } - @Override public ReadContext singleUse() { return singleUse(TimestampBound.strong()); @@ -240,26 +240,25 @@ public ReadOnlyTransaction readOnlyTransaction(TimestampBound bound) { } @Override - public TransactionRunner readWriteTransaction() { - return setActive( - new TransactionRunnerImpl(this, spanner.getRpc(), spanner.getDefaultPrefetchChunks())); + public TransactionRunner readWriteTransaction(TransactionOption... options) { + return setActive(new TransactionRunnerImpl(this, Options.fromTransactionOptions(options))); } @Override - public AsyncRunner runAsync() { + public AsyncRunner runAsync(TransactionOption... options) { return new AsyncRunnerImpl( - setActive( - new TransactionRunnerImpl(this, spanner.getRpc(), spanner.getDefaultPrefetchChunks()))); + setActive(new TransactionRunnerImpl(this, Options.fromTransactionOptions(options)))); } @Override - public TransactionManager transactionManager() { - return new TransactionManagerImpl(this, currentSpan); + public TransactionManager transactionManager(TransactionOption... options) { + return new TransactionManagerImpl(this, currentSpan, Options.fromTransactionOptions(options)); } @Override - public AsyncTransactionManagerImpl transactionManagerAsync() { - return new AsyncTransactionManagerImpl(this, currentSpan); + public AsyncTransactionManagerImpl transactionManagerAsync(TransactionOption... options) { + return new AsyncTransactionManagerImpl( + this, currentSpan, Options.fromTransactionOptions(options)); } @Override @@ -340,9 +339,10 @@ public void run() { return res; } - TransactionContextImpl newTransaction() { + TransactionContextImpl newTransaction(Options options) { return TransactionContextImpl.newBuilder() .setSession(this) + .setOptions(options) .setTransactionId(readyTransactionId) .setRpc(spanner.getRpc()) .setDefaultQueryOptions(spanner.getDefaultQueryOptions(databaseId)) 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 dbd82bbeb4e..8bfbc0cc756 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 @@ -38,6 +38,7 @@ import static com.google.cloud.spanner.MetricRegistryConstants.SPANNER_LABEL_KEYS_WITH_TYPE; import static com.google.cloud.spanner.SpannerExceptionFactory.newSpannerException; +import com.google.api.core.ApiFunction; import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutures; import com.google.api.core.SettableApiFuture; @@ -714,23 +715,26 @@ public void close() { private TransactionManager delegate; private final SessionPool sessionPool; private PooledSessionFuture session; + private final TransactionOption[] options; private boolean closed; private boolean restartedAfterSessionNotFound; - AutoClosingTransactionManager(SessionPool sessionPool, PooledSessionFuture session) { + AutoClosingTransactionManager( + SessionPool sessionPool, PooledSessionFuture session, TransactionOption... options) { this.sessionPool = sessionPool; this.session = session; + this.options = options; } @Override public TransactionContext begin() { - this.delegate = session.get().transactionManager(); + this.delegate = session.get().transactionManager(options); while (true) { try { return internalBegin(); } catch (SessionNotFoundException e) { session = sessionPool.replaceSession(e, session); - delegate = session.get().delegate.transactionManager(); + delegate = session.get().delegate.transactionManager(options); } } } @@ -743,7 +747,7 @@ private TransactionContext internalBegin() { private SpannerException handleSessionNotFound(SessionNotFoundException notFound) { session = sessionPool.replaceSession(notFound, session); - delegate = session.get().delegate.transactionManager(); + delegate = session.get().delegate.transactionManager(options); restartedAfterSessionNotFound = true; return SpannerExceptionFactory.newSpannerException( ErrorCode.ABORTED, notFound.getMessage(), notFound); @@ -784,7 +788,7 @@ public TransactionContext resetForRetry() { } } catch (SessionNotFoundException e) { session = sessionPool.replaceSession(e, session); - delegate = session.get().delegate.transactionManager(); + delegate = session.get().delegate.transactionManager(options); restartedAfterSessionNotFound = true; } } @@ -795,6 +799,11 @@ public Timestamp getCommitTimestamp() { return delegate.getCommitTimestamp(); } + @Override + public CommitResponse getCommitResponse() { + return delegate.getCommitResponse(); + } + @Override public void close() { if (closed) { @@ -827,16 +836,19 @@ public TransactionState getState() { private static final class SessionPoolTransactionRunner implements TransactionRunner { private final SessionPool sessionPool; private PooledSessionFuture session; + private final TransactionOption[] options; private TransactionRunner runner; - private SessionPoolTransactionRunner(SessionPool sessionPool, PooledSessionFuture session) { + private SessionPoolTransactionRunner( + SessionPool sessionPool, PooledSessionFuture session, TransactionOption... options) { this.sessionPool = sessionPool; this.session = session; + this.options = options; } private TransactionRunner getRunner() { if (this.runner == null) { - this.runner = session.get().readWriteTransaction(); + this.runner = session.get().readWriteTransaction(options); } return runner; } @@ -869,6 +881,11 @@ public Timestamp getCommitTimestamp() { return getRunner().getCommitTimestamp(); } + @Override + public CommitResponse getCommitResponse() { + return getRunner().getCommitResponse(); + } + @Override public TransactionRunner allowNestedTransaction() { getRunner().allowNestedTransaction(); @@ -879,11 +896,14 @@ public TransactionRunner allowNestedTransaction() { private static class SessionPoolAsyncRunner implements AsyncRunner { private final SessionPool sessionPool; private volatile PooledSessionFuture session; - private final SettableApiFuture commitTimestamp = SettableApiFuture.create(); + private final TransactionOption[] options; + private final SettableApiFuture commitResponse = SettableApiFuture.create(); - private SessionPoolAsyncRunner(SessionPool sessionPool, PooledSessionFuture session) { + private SessionPoolAsyncRunner( + SessionPool sessionPool, PooledSessionFuture session, TransactionOption... options) { this.sessionPool = sessionPool; this.session = session; + this.options = options; } @Override @@ -898,7 +918,7 @@ public void run() { AsyncRunner runner = null; while (true) { try { - runner = session.get().runAsync(); + runner = session.get().runAsync(options); r = runner.runAsync(work, MoreExecutors.directExecutor()).get(); break; } catch (ExecutionException e) { @@ -917,7 +937,7 @@ public void run() { } session.get().markUsed(); session.close(); - setCommitTimestamp(runner); + setCommitResponse(runner); if (se != null) { res.setException(se); } else { @@ -928,17 +948,30 @@ public void run() { return res; } - private void setCommitTimestamp(AsyncRunner delegate) { + private void setCommitResponse(AsyncRunner delegate) { try { - commitTimestamp.set(delegate.getCommitTimestamp().get()); + commitResponse.set(delegate.getCommitResponse().get()); } catch (Throwable t) { - commitTimestamp.setException(t); + commitResponse.setException(t); } } @Override public ApiFuture getCommitTimestamp() { - return commitTimestamp; + return ApiFutures.transform( + commitResponse, + new ApiFunction() { + @Override + public Timestamp apply(CommitResponse input) { + return input.getCommitTimestamp(); + } + }, + MoreExecutors.directExecutor()); + } + + @Override + public ApiFuture getCommitResponse() { + return commitResponse; } } @@ -986,34 +1019,32 @@ private void markCheckedOut() { @Override public Timestamp write(Iterable mutations) throws SpannerException { - try { - return get().write(mutations); - } finally { - close(); - } + return writeWithOptions(mutations).getCommitTimestamp(); } @Override public CommitResponse writeWithOptions( Iterable mutations, TransactionOption... options) throws SpannerException { - final Timestamp commitTimestamp = write(mutations); - return new CommitResponse(commitTimestamp); - } - - @Override - public Timestamp writeAtLeastOnce(Iterable mutations) throws SpannerException { try { - return get().writeAtLeastOnce(mutations); + return get().writeWithOptions(mutations, options); } finally { close(); } } + @Override + public Timestamp writeAtLeastOnce(Iterable mutations) throws SpannerException { + return writeAtLeastOnceWithOptions(mutations).getCommitTimestamp(); + } + @Override public CommitResponse writeAtLeastOnceWithOptions( Iterable mutations, TransactionOption... options) throws SpannerException { - final Timestamp commitTimestamp = writeAtLeastOnce(mutations); - return new CommitResponse(commitTimestamp); + try { + return get().writeAtLeastOnceWithOptions(mutations, options); + } finally { + close(); + } } @Override @@ -1115,23 +1146,23 @@ private ReadOnlyTransaction internalReadOnlyTransaction( } @Override - public TransactionRunner readWriteTransaction() { - return new SessionPoolTransactionRunner(SessionPool.this, this); + public TransactionRunner readWriteTransaction(TransactionOption... options) { + return new SessionPoolTransactionRunner(SessionPool.this, this, options); } @Override - public TransactionManager transactionManager() { - return new AutoClosingTransactionManager(SessionPool.this, this); + public TransactionManager transactionManager(TransactionOption... options) { + return new AutoClosingTransactionManager(SessionPool.this, this, options); } @Override - public AsyncRunner runAsync() { - return new SessionPoolAsyncRunner(SessionPool.this, this); + public AsyncRunner runAsync(TransactionOption... options) { + return new SessionPoolAsyncRunner(SessionPool.this, this, options); } @Override - public AsyncTransactionManager transactionManagerAsync() { - return new SessionPoolAsyncTransactionManager(this); + public AsyncTransactionManager transactionManagerAsync(TransactionOption... options) { + return new SessionPoolAsyncTransactionManager(this, options); } @Override @@ -1243,38 +1274,36 @@ void setAllowReplacing(boolean allowReplacing) { @Override public Timestamp write(Iterable mutations) throws SpannerException { + return writeWithOptions(mutations).getCommitTimestamp(); + } + + @Override + public CommitResponse writeWithOptions( + Iterable mutations, TransactionOption... options) throws SpannerException { try { markUsed(); - return delegate.write(mutations); + return delegate.writeWithOptions(mutations, options); } catch (SpannerException e) { throw lastException = e; } } @Override - public CommitResponse writeWithOptions( - Iterable mutations, TransactionOption... options) throws SpannerException { - final Timestamp commitTimestamp = write(mutations); - return new CommitResponse(commitTimestamp); + public Timestamp writeAtLeastOnce(Iterable mutations) throws SpannerException { + return writeAtLeastOnceWithOptions(mutations).getCommitTimestamp(); } @Override - public Timestamp writeAtLeastOnce(Iterable mutations) throws SpannerException { + public CommitResponse writeAtLeastOnceWithOptions( + Iterable mutations, TransactionOption... options) throws SpannerException { try { markUsed(); - return delegate.writeAtLeastOnce(mutations); + return delegate.writeAtLeastOnceWithOptions(mutations, options); } catch (SpannerException e) { throw lastException = e; } } - @Override - public CommitResponse writeAtLeastOnceWithOptions( - Iterable mutations, TransactionOption... options) throws SpannerException { - final Timestamp commitTimestamp = writeAtLeastOnce(mutations); - return new CommitResponse(commitTimestamp); - } - @Override public long executePartitionedUpdate(Statement stmt) throws SpannerException { try { @@ -1316,18 +1345,18 @@ public ReadOnlyTransaction readOnlyTransaction(TimestampBound bound) { } @Override - public TransactionRunner readWriteTransaction() { - return delegate.readWriteTransaction(); + public TransactionRunner readWriteTransaction(TransactionOption... options) { + return delegate.readWriteTransaction(options); } @Override - public AsyncRunner runAsync() { - return delegate.runAsync(); + public AsyncRunner runAsync(TransactionOption... options) { + return delegate.runAsync(options); } @Override - public AsyncTransactionManagerImpl transactionManagerAsync() { - return delegate.transactionManagerAsync(); + public AsyncTransactionManagerImpl transactionManagerAsync(TransactionOption... options) { + return delegate.transactionManagerAsync(options); } @Override @@ -1398,8 +1427,8 @@ void markUsed() { } @Override - public TransactionManager transactionManager() { - return delegate.transactionManager(); + public TransactionManager transactionManager(TransactionOption... options) { + return delegate.transactionManager(options); } } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolAsyncTransactionManager.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolAsyncTransactionManager.java index 54b621b93b8..35ab0188521 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolAsyncTransactionManager.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolAsyncTransactionManager.java @@ -22,6 +22,7 @@ import com.google.api.core.ApiFutures; import com.google.api.core.SettableApiFuture; import com.google.cloud.Timestamp; +import com.google.cloud.spanner.Options.TransactionOption; import com.google.cloud.spanner.SessionPool.PooledSessionFuture; import com.google.cloud.spanner.TransactionContextFutureImpl.CommittableAsyncTransactionManager; import com.google.cloud.spanner.TransactionManager.TransactionState; @@ -39,7 +40,8 @@ class SessionPoolAsyncTransactionManager implements CommittableAsyncTransactionM private final SettableApiFuture delegate = SettableApiFuture.create(); - SessionPoolAsyncTransactionManager(PooledSessionFuture session) { + SessionPoolAsyncTransactionManager( + PooledSessionFuture session, final TransactionOption... options) { this.session = session; this.session.addListener( new Runnable() { @@ -47,7 +49,10 @@ class SessionPoolAsyncTransactionManager implements CommittableAsyncTransactionM public void run() { try { delegate.set( - SessionPoolAsyncTransactionManager.this.session.get().transactionManagerAsync()); + SessionPoolAsyncTransactionManager.this + .session + .get() + .transactionManagerAsync(options)); } catch (Throwable t) { delegate.setException(t); } @@ -239,4 +244,22 @@ public TransactionState getState() { return txnState; } } + + public ApiFuture getCommitResponse() { + synchronized (lock) { + Preconditions.checkState( + txnState == TransactionState.COMMITTED, + "commit can only be invoked if the transaction was successfully committed"); + } + return ApiFutures.transformAsync( + delegate, + new ApiAsyncFunction() { + @Override + public ApiFuture apply(AsyncTransactionManagerImpl input) + throws Exception { + return input.getCommitResponse(); + } + }, + MoreExecutors.directExecutor()); + } } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManager.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManager.java index 34e21657152..c9a56d8100a 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManager.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManager.java @@ -87,6 +87,9 @@ public enum TransactionState { */ Timestamp getCommitTimestamp(); + /** Returns the {@link CommitResponse} of this transaction. */ + CommitResponse getCommitResponse(); + /** Returns the state of the transaction. */ TransactionState getState(); diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManagerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManagerImpl.java index b18e2f25d9a..f7cea28dd2b 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManagerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManagerImpl.java @@ -30,13 +30,15 @@ final class TransactionManagerImpl implements TransactionManager, SessionTransac private final SessionImpl session; private Span span; + private final Options options; private TransactionRunnerImpl.TransactionContextImpl txn; private TransactionState txnState; - TransactionManagerImpl(SessionImpl session, Span span) { + TransactionManagerImpl(SessionImpl session, Span span, Options options) { this.session = session; this.span = span; + this.options = options; } Span getSpan() { @@ -52,7 +54,7 @@ public void setSpan(Span span) { public TransactionContext begin() { Preconditions.checkState(txn == null, "begin can only be called once"); try (Scope s = tracer.withSpan(span)) { - txn = session.newTransaction(); + txn = session.newTransaction(options); session.setActive(this); txnState = TransactionState.STARTED; return txn; @@ -101,7 +103,7 @@ public TransactionContext resetForRetry() { } try (Scope s = tracer.withSpan(span)) { boolean useInlinedBegin = txn.transactionId != null; - txn = session.newTransaction(); + txn = session.newTransaction(options); if (!useInlinedBegin) { txn.ensureTxn(); } @@ -115,7 +117,14 @@ public Timestamp getCommitTimestamp() { Preconditions.checkState( txnState == TransactionState.COMMITTED, "getCommitTimestamp can only be invoked if the transaction committed successfully"); - return txn.commitTimestamp(); + return txn.getCommitResponse().getCommitTimestamp(); + } + + public CommitResponse getCommitResponse() { + Preconditions.checkState( + txnState == TransactionState.COMMITTED, + "getCommitTimestamp can only be invoked if the transaction committed successfully"); + return txn.getCommitResponse(); } @Override diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunner.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunner.java index 2ad27fcd7b5..33cb57e90fe 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunner.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunner.java @@ -74,6 +74,9 @@ interface TransactionCallable { */ Timestamp getCommitTimestamp(); + /** Returns the {@link CommitResponse} of this transaction. */ + CommitResponse getCommitResponse(); + /** * Allows overriding the default behaviour of blocking nested transactions. * 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 e38b704f700..53cceac932d 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 @@ -29,15 +29,14 @@ import com.google.cloud.spanner.Options.QueryOption; import com.google.cloud.spanner.Options.ReadOption; import com.google.cloud.spanner.SessionImpl.SessionTransaction; -import com.google.cloud.spanner.spi.v1.SpannerRpc; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.MoreExecutors; import com.google.protobuf.ByteString; import com.google.protobuf.Empty; import com.google.rpc.Code; import com.google.spanner.v1.CommitRequest; -import com.google.spanner.v1.CommitResponse; import com.google.spanner.v1.ExecuteBatchDmlRequest; import com.google.spanner.v1.ExecuteBatchDmlResponse; import com.google.spanner.v1.ExecuteSqlRequest; @@ -72,6 +71,7 @@ class TransactionRunnerImpl implements SessionTransaction, TransactionRunner { static class TransactionContextImpl extends AbstractReadContext implements TransactionContext { static class Builder extends AbstractReadContext.Builder { private ByteString transactionId; + private Options options = Options.fromTransactionOptions(); private Builder() {} @@ -80,6 +80,11 @@ Builder setTransactionId(ByteString transactionId) { return self(); } + Builder setOptions(Options options) { + this.options = options; + return self(); + } + @Override TransactionContextImpl build() { return new TransactionContextImpl(this); @@ -160,11 +165,13 @@ public void removeListener(Runnable listener) { volatile ByteString transactionId; - private Timestamp commitTimestamp; + private final Options options; + private CommitResponse commitResponse; private TransactionContextImpl(Builder builder) { super(builder); this.transactionId = builder.transactionId; + this.options = Preconditions.checkNotNull(builder.options); this.finishedAsyncOperations.set(null); } @@ -249,7 +256,7 @@ public void run() { void commit() { try { - commitTimestamp = commitAsync().get(); + commitResponse = commitAsync().get(); } catch (InterruptedException e) { if (commitFuture != null) { commitFuture.cancel(true); @@ -262,10 +269,13 @@ void commit() { volatile ApiFuture commitFuture; - ApiFuture commitAsync() { - final SettableApiFuture res = SettableApiFuture.create(); + ApiFuture commitAsync() { + final SettableApiFuture res = SettableApiFuture.create(); final SettableApiFuture finishOps; - CommitRequest.Builder builder = CommitRequest.newBuilder().setSession(session.getName()); + CommitRequest.Builder builder = + CommitRequest.newBuilder() + .setSession(session.getName()) + .setReturnCommitStats(options.withCommitStats()); synchronized (lock) { if (transactionIdFuture == null && transactionId == null) { finishOps = SettableApiFuture.create(); @@ -287,12 +297,12 @@ ApiFuture commitAsync() { } private final class CommitRunnable implements Runnable { - private final SettableApiFuture res; + private final SettableApiFuture res; private final ApiFuture prev; private final CommitRequest.Builder requestBuilder; CommitRunnable( - SettableApiFuture res, + SettableApiFuture res, ApiFuture prev, CommitRequest.Builder requestBuilder) { this.res = res; @@ -316,7 +326,7 @@ public void run() { span.addAnnotation("Starting Commit"); final Span opSpan = tracer.spanBuilderWithExplicitParent(SpannerImpl.COMMIT, span).startSpan(); - final ApiFuture commitFuture = + final ApiFuture commitFuture = rpc.commitAsync(commitRequest, session.getOptions()); commitFuture.addListener( tracer.withSpan( @@ -325,15 +335,14 @@ public void run() { @Override public void run() { try { - CommitResponse commitResponse = commitFuture.get(); - if (!commitResponse.hasCommitTimestamp()) { + com.google.spanner.v1.CommitResponse proto = commitFuture.get(); + if (!proto.hasCommitTimestamp()) { throw newSpannerException( ErrorCode.INTERNAL, "Missing commitTimestamp:\n" + session.getName()); } - Timestamp ts = Timestamp.fromProto(commitResponse.getCommitTimestamp()); span.addAnnotation("Commit Done"); opSpan.end(TraceUtil.END_SPAN_OPTIONS); - res.set(ts); + res.set(new CommitResponse(proto)); } catch (Throwable e) { if (e instanceof ExecutionException) { e = @@ -361,9 +370,9 @@ public void run() { } } - Timestamp commitTimestamp() { - checkState(commitTimestamp != null, "run() has not yet returned normally"); - return commitTimestamp; + CommitResponse getCommitResponse() { + checkState(commitResponse != null, "run() has not yet returned normally"); + return commitResponse; } boolean isAborted() { @@ -724,6 +733,7 @@ public ListenableAsyncResultSet executeQueryAsync( private boolean blockNestedTxn = true; private final SessionImpl session; private Span span; + private final Options options; private TransactionContextImpl txn; private volatile boolean isValid = true; @@ -733,9 +743,10 @@ public TransactionRunner allowNestedTransaction() { return this; } - TransactionRunnerImpl(SessionImpl session, SpannerRpc rpc, int defaultPrefetchChunks) { + TransactionRunnerImpl(SessionImpl session, Options options) { this.session = session; - this.txn = session.newTransaction(); + this.options = options; + this.txn = session.newTransaction(options); } @Override @@ -773,7 +784,7 @@ public T call() { // Do not inline the BeginTransaction during a retry if the initial attempt did not // actually start a transaction. useInlinedBegin = txn.transactionId != null; - txn = session.newTransaction(); + txn = session.newTransaction(options); } checkState( isValid, @@ -857,7 +868,12 @@ public T call() { @Override public Timestamp getCommitTimestamp() { checkState(txn != null, "run() has not yet returned normally"); - return txn.commitTimestamp(); + return txn.getCommitResponse().getCommitTimestamp(); + } + + public CommitResponse getCommitResponse() { + checkState(txn != null, "run() has not yet returned normally"); + return txn.getCommitResponse(); } @Override diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java new file mode 100644 index 00000000000..03f024285d6 --- /dev/null +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java @@ -0,0 +1,61 @@ +/* + * Copyright 2020 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; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +import com.google.api.core.ApiFutures; +import com.google.cloud.Timestamp; +import io.opencensus.trace.Span; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.Mock; + +@RunWith(JUnit4.class) +public class AsyncTransactionManagerImplTest { + + @Mock private SessionImpl session; + @Mock TransactionRunnerImpl.TransactionContextImpl txn; + + @Before + public void setUp() { + initMocks(this); + } + + @Test + public void commitReturnsCommitStats() { + try (AsyncTransactionManagerImpl manager = + new AsyncTransactionManagerImpl( + session, mock(Span.class), Options.fromTransactionOptions(Options.commitStats()))) { + when(session.newTransaction(Options.fromTransactionOptions(Options.commitStats()))) + .thenReturn(txn); + when(txn.ensureTxnAsync()).thenReturn(ApiFutures.immediateFuture(null)); + Timestamp commitTimestamp = Timestamp.ofTimeMicroseconds(1); + CommitResponse response = mock(CommitResponse.class); + when(response.getCommitTimestamp()).thenReturn(commitTimestamp); + when(txn.commitAsync()).thenReturn(ApiFutures.immediateFuture(response)); + manager.beginAsync(); + manager.commitAsync(); + verify(txn).commitAsync(); + } + } +} diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java index ddf8f580a50..d4420a96cd9 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java @@ -210,6 +210,32 @@ public boolean apply(AbstractMessage input) { 0L); } + @Test + public void asyncTransactionManager_returnsCommitStats() throws Exception { + try (AsyncTransactionManager manager = + client().transactionManagerAsync(Options.commitStats())) { + TransactionContextFuture txn = manager.beginAsync(); + while (true) { + try { + CommitTimestampFuture commitTimestamp = + txn.then( + AsyncTransactionManagerHelper.buffer( + Mutation.delete("FOO", Key.of("foo"))), + executor) + .commitAsync(); + assertThat(commitTimestamp.get()).isNotNull(); + assertThat(manager.getCommitResponse().get()).isNotNull(); + assertThat(manager.getCommitResponse().get().getCommitStats()).isNotNull(); + assertThat(manager.getCommitResponse().get().getCommitStats().getMutationCount()) + .isEqualTo(1); + break; + } catch (AbortedException e) { + txn = manager.resetForRetryAsync(); + } + } + } + } + @Test public void asyncTransactionManagerUpdate() throws Exception { final SettableApiFuture updateCount = SettableApiFuture.create(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java index 2747dc314f7..9593687e149 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java @@ -17,6 +17,7 @@ package com.google.cloud.spanner; import static com.google.cloud.spanner.MockSpannerTestUtil.SELECT1; +import static com.google.cloud.spanner.SpannerApiFutures.get; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; @@ -157,6 +158,20 @@ public void write() { Mutation.newInsertBuilder("FOO").set("ID").to(1L).set("NAME").to("Bar").build())); } + @Test + public void writeWithCommitStats() { + DatabaseClient client = + spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); + CommitResponse response = + client.writeWithOptions( + Arrays.asList( + Mutation.newInsertBuilder("FOO").set("ID").to(1L).set("NAME").to("Bar").build()), + Options.commitStats()); + assertThat(response).isNotNull(); + assertThat(response.getCommitTimestamp()).isNotNull(); + assertThat(response.getCommitStats()).isNotNull(); + } + @Test public void writeAtLeastOnce() { DatabaseClient client = @@ -166,6 +181,20 @@ public void writeAtLeastOnce() { Mutation.newInsertBuilder("FOO").set("ID").to(1L).set("NAME").to("Bar").build())); } + @Test + public void writeAtLeastOnceWithCommitStats() { + DatabaseClient client = + spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); + CommitResponse response = + client.writeAtLeastOnceWithOptions( + Arrays.asList( + Mutation.newInsertBuilder("FOO").set("ID").to(1L).set("NAME").to("Bar").build()), + Options.commitStats()); + assertThat(response).isNotNull(); + assertThat(response.getCommitTimestamp()).isNotNull(); + assertThat(response.getCommitStats()).isNotNull(); + } + @Test public void singleUse() { DatabaseClient client = @@ -434,6 +463,24 @@ public Void run(TransactionContext transaction) throws Exception { }); } + @Test + public void readWriteTransaction_returnsCommitStats() { + DatabaseClient client = + spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); + TransactionRunner runner = client.readWriteTransaction(Options.commitStats()); + runner.run( + new TransactionCallable() { + @Override + public Void run(TransactionContext transaction) throws Exception { + transaction.buffer(Mutation.delete("FOO", Key.of("foo"))); + return null; + } + }); + assertThat(runner.getCommitResponse()).isNotNull(); + assertThat(runner.getCommitResponse().getCommitStats()).isNotNull(); + assertThat(runner.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(1); + } + @Test public void readWriteTransactionIsNonBlocking() { mockSpanner.freeze(); @@ -473,6 +520,29 @@ public ApiFuture doWorkAsync(TransactionContext txn) { executor.shutdown(); } + @Test + public void runAsync_returnsCommitStats() { + DatabaseClient client = + spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); + ExecutorService executor = Executors.newSingleThreadExecutor(); + AsyncRunner runner = client.runAsync(Options.commitStats()); + ApiFuture fut = + runner.runAsync( + new AsyncWork() { + @Override + public ApiFuture doWorkAsync(TransactionContext txn) { + txn.buffer(Mutation.delete("FOO", Key.of("foo"))); + return ApiFutures.immediateFuture(null); + } + }, + executor); + assertThat(get(fut)).isNull(); + assertThat(get(runner.getCommitResponse())).isNotNull(); + assertThat(get(runner.getCommitResponse()).getCommitStats()).isNotNull(); + assertThat(get(runner.getCommitResponse()).getCommitStats().getMutationCount()).isEqualTo(1); + executor.shutdown(); + } + @Test public void runAsyncIsNonBlocking() throws Exception { mockSpanner.freeze(); @@ -540,6 +610,29 @@ public void transactionManager() throws Exception { } } + @Test + public void transactionManager_returnsCommitStats() throws InterruptedException { + DatabaseClient client = + spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); + try (TransactionManager txManager = client.transactionManager(Options.commitStats())) { + while (true) { + TransactionContext tx = txManager.begin(); + try { + tx.buffer(Mutation.delete("FOO", Key.of("foo"))); + txManager.commit(); + assertThat(txManager.getCommitResponse()).isNotNull(); + assertThat(txManager.getCommitResponse().getCommitStats()).isNotNull(); + assertThat(txManager.getCommitResponse().getCommitStats().getMutationCount()) + .isEqualTo(1); + break; + } catch (AbortedException e) { + Thread.sleep(e.getRetryDelayInMillis() / 1000); + tx = txManager.resetForRetry(); + } + } + } + } + @Test public void transactionManagerIsNonBlocking() throws Exception { mockSpanner.freeze(); 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 85e935a75a7..e0b61e392ea 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 @@ -186,6 +186,8 @@ * } */ public class MockSpannerServiceImpl extends SpannerImplBase implements MockGrpcService { + private static final Random RANDOM = new Random(); + private static class PartialResultSetsIterator implements Iterator { private static final int MAX_ROWS_IN_CHUNK = 1; @@ -407,7 +409,6 @@ private StatusRuntimeException getException() { /** Class for simulating execution time of server calls. */ public static class SimulatedExecutionTime { - private static final Random RANDOM = new Random(); private final int minimumExecutionTime; private final int randomExecutionTime; private final Queue exceptions; @@ -501,7 +502,9 @@ void simulateExecutionTime( } if (minimumExecutionTime > 0 || randomExecutionTime > 0) { Uninterruptibles.sleepUninterruptibly( - (randomExecutionTime == 0 ? 0 : RANDOM.nextInt(randomExecutionTime)) + (randomExecutionTime == 0 + ? 0 + : MockSpannerServiceImpl.RANDOM.nextInt(randomExecutionTime)) + minimumExecutionTime, TimeUnit.MILLISECONDS); } @@ -1766,8 +1769,18 @@ public void commit(CommitRequest request, StreamObserver respons } simulateAbort(session, request.getTransactionId()); commitTransaction(transaction.getId()); - responseObserver.onNext( - CommitResponse.newBuilder().setCommitTimestamp(getCurrentGoogleTimestamp()).build()); + CommitResponse.Builder responseBuilder = + CommitResponse.newBuilder().setCommitTimestamp(getCurrentGoogleTimestamp()); + if (request.getReturnCommitStats()) { + responseBuilder.setCommitStats( + com.google.spanner.v1.CommitResponse.CommitStats.newBuilder() + // This is not really always equal, but at least it returns a value. + .setMutationCount(request.getMutationsCount()) + .setOverloadDelay( + Duration.newBuilder().setSeconds(0L).setNanos(RANDOM.nextInt(1_000_000_000))) + .build()); + } + responseObserver.onNext(responseBuilder.build()); responseObserver.onCompleted(); } catch (StatusRuntimeException t) { responseObserver.onError(t); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java index 0620bfb0e98..cfb4a71e5f5 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java @@ -676,7 +676,7 @@ public void run() { clock.currentTimeMillis += clock.currentTimeMillis + (options.getKeepAliveIntervalMinutes() + 5) * 60 * 1000; session1 = pool.getSession(); - session1.writeAtLeastOnce(new ArrayList()); + session1.writeAtLeastOnceWithOptions(new ArrayList()); session1.close(); runMaintainanceLoop(clock, pool, pool.poolMaintainer.numKeepAliveCycles); // The session pool only keeps MinSessions + MaxIdleSessions alive. @@ -890,13 +890,18 @@ public void testSessionNotFoundReadWriteTransaction() { when(closedSession.getName()) .thenReturn("projects/dummy/instances/dummy/database/dummy/sessions/session-closed"); final TransactionContextImpl closedTransactionContext = - TransactionContextImpl.newBuilder().setSession(closedSession).setRpc(rpc).build(); + TransactionContextImpl.newBuilder() + .setSession(closedSession) + .setRpc(rpc) + .setOptions(Options.fromTransactionOptions()) + .build(); when(closedSession.asyncClose()) .thenReturn(ApiFutures.immediateFuture(Empty.getDefaultInstance())); - when(closedSession.newTransaction()).thenReturn(closedTransactionContext); + when(closedSession.newTransaction(Options.fromTransactionOptions())) + .thenReturn(closedTransactionContext); when(closedSession.beginTransactionAsync()).thenThrow(sessionNotFound); TransactionRunnerImpl closedTransactionRunner = - new TransactionRunnerImpl(closedSession, rpc, 10); + new TransactionRunnerImpl(closedSession, Options.fromTransactionOptions()); closedTransactionRunner.setSpan(mock(Span.class)); when(closedSession.readWriteTransaction()).thenReturn(closedTransactionRunner); @@ -906,11 +911,12 @@ public void testSessionNotFoundReadWriteTransaction() { when(openSession.getName()) .thenReturn("projects/dummy/instances/dummy/database/dummy/sessions/session-open"); final TransactionContextImpl openTransactionContext = mock(TransactionContextImpl.class); - when(openSession.newTransaction()).thenReturn(openTransactionContext); + when(openSession.newTransaction(Options.fromTransactionOptions())) + .thenReturn(openTransactionContext); when(openSession.beginTransactionAsync()) .thenReturn(ApiFutures.immediateFuture(ByteString.copyFromUtf8("open-txn"))); TransactionRunnerImpl openTransactionRunner = - new TransactionRunnerImpl(openSession, mock(SpannerRpc.class), 10); + new TransactionRunnerImpl(openSession, Options.fromTransactionOptions()); openTransactionRunner.setSpan(mock(Span.class)); when(openSession.readWriteTransaction()).thenReturn(openTransactionRunner); @@ -1041,10 +1047,13 @@ public void testSessionNotFoundWrite() { SpannerExceptionFactoryTest.newSessionNotFoundException(sessionName); List mutations = Arrays.asList(Mutation.newInsertBuilder("FOO").build()); final SessionImpl closedSession = mockSession(); - when(closedSession.write(mutations)).thenThrow(sessionNotFound); + when(closedSession.writeWithOptions(mutations)).thenThrow(sessionNotFound); final SessionImpl openSession = mockSession(); - when(openSession.write(mutations)).thenReturn(Timestamp.now()); + com.google.cloud.spanner.CommitResponse response = + mock(com.google.cloud.spanner.CommitResponse.class); + when(response.getCommitTimestamp()).thenReturn(Timestamp.now()); + when(openSession.writeWithOptions(mutations)).thenReturn(response); doAnswer( new Answer() { @Override @@ -1093,10 +1102,13 @@ public void testSessionNotFoundWriteAtLeastOnce() { SpannerExceptionFactoryTest.newSessionNotFoundException(sessionName); List mutations = Arrays.asList(Mutation.newInsertBuilder("FOO").build()); final SessionImpl closedSession = mockSession(); - when(closedSession.writeAtLeastOnce(mutations)).thenThrow(sessionNotFound); + when(closedSession.writeAtLeastOnceWithOptions(mutations)).thenThrow(sessionNotFound); final SessionImpl openSession = mockSession(); - when(openSession.writeAtLeastOnce(mutations)).thenReturn(Timestamp.now()); + com.google.cloud.spanner.CommitResponse response = + mock(com.google.cloud.spanner.CommitResponse.class); + when(response.getCommitTimestamp()).thenReturn(Timestamp.now()); + when(openSession.writeAtLeastOnceWithOptions(mutations)).thenReturn(response); doAnswer( new Answer() { @Override diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionContextImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionContextImplTest.java index 077b6605766..990c52ac685 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionContextImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionContextImplTest.java @@ -16,14 +16,19 @@ package com.google.cloud.spanner; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyMap; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import com.google.api.core.ApiFutures; import com.google.cloud.spanner.TransactionRunnerImpl.TransactionContextImpl; import com.google.cloud.spanner.spi.v1.SpannerRpc; import com.google.protobuf.ByteString; import com.google.rpc.Code; import com.google.rpc.Status; +import com.google.spanner.v1.CommitRequest; import com.google.spanner.v1.ExecuteBatchDmlRequest; import com.google.spanner.v1.ExecuteBatchDmlResponse; import java.util.Arrays; @@ -45,6 +50,35 @@ public void batchDmlException() { batchDml(Code.FAILED_PRECONDITION_VALUE); } + @SuppressWarnings("unchecked") + @Test + public void testReturnCommitStats() { + SessionImpl session = mock(SessionImpl.class); + when(session.getName()).thenReturn("test"); + ByteString txId = ByteString.copyFromUtf8("test"); + SpannerRpc rpc = mock(SpannerRpc.class); + when(rpc.commitAsync(any(CommitRequest.class), anyMap())) + .thenReturn( + ApiFutures.immediateFuture(com.google.spanner.v1.CommitResponse.getDefaultInstance())); + + try (TransactionContextImpl impl = + TransactionContextImpl.newBuilder() + .setSession(session) + .setRpc(rpc) + .setTransactionId(txId) + .setOptions(Options.fromTransactionOptions(Options.commitStats())) + .build()) { + impl.commitAsync(); + CommitRequest request = + CommitRequest.newBuilder() + .setReturnCommitStats(true) + .setSession(session.getName()) + .setTransactionId(txId) + .build(); + verify(rpc).commitAsync(Mockito.eq(request), anyMap()); + } + } + @SuppressWarnings("unchecked") private void batchDml(int status) { SessionImpl session = mock(SessionImpl.class); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java index 149002531ae..32731c360b9 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java @@ -37,7 +37,6 @@ import com.google.protobuf.Empty; import com.google.spanner.v1.BeginTransactionRequest; import com.google.spanner.v1.CommitRequest; -import com.google.spanner.v1.CommitResponse; import com.google.spanner.v1.ExecuteSqlRequest; import com.google.spanner.v1.ExecuteSqlRequest.QueryOptions; import com.google.spanner.v1.ResultSetMetadata; @@ -82,12 +81,13 @@ public void release(ScheduledExecutorService exec) { @Before public void setUp() { initMocks(this); - manager = new TransactionManagerImpl(session, mock(Span.class)); + manager = + new TransactionManagerImpl(session, mock(Span.class), Options.fromTransactionOptions()); } @Test public void beginCalledTwiceFails() { - when(session.newTransaction()).thenReturn(txn); + when(session.newTransaction(Options.fromTransactionOptions())).thenReturn(txn); assertThat(manager.begin()).isEqualTo(txn); assertThat(manager.getState()).isEqualTo(TransactionState.STARTED); try { @@ -130,7 +130,7 @@ public void resetBeforeBeginFails() { @Test public void transactionRolledBackOnClose() { - when(session.newTransaction()).thenReturn(txn); + when(session.newTransaction(Options.fromTransactionOptions())).thenReturn(txn); when(txn.isAborted()).thenReturn(false); manager.begin(); manager.close(); @@ -139,9 +139,11 @@ public void transactionRolledBackOnClose() { @Test public void commitSucceeds() { - when(session.newTransaction()).thenReturn(txn); + when(session.newTransaction(Options.fromTransactionOptions())).thenReturn(txn); Timestamp commitTimestamp = Timestamp.ofTimeMicroseconds(1); - when(txn.commitTimestamp()).thenReturn(commitTimestamp); + CommitResponse response = mock(CommitResponse.class); + when(response.getCommitTimestamp()).thenReturn(commitTimestamp); + when(txn.getCommitResponse()).thenReturn(response); manager.begin(); manager.commit(); assertThat(manager.getState()).isEqualTo(TransactionState.COMMITTED); @@ -150,7 +152,7 @@ public void commitSucceeds() { @Test public void resetAfterSuccessfulCommitFails() { - when(session.newTransaction()).thenReturn(txn); + when(session.newTransaction(Options.fromTransactionOptions())).thenReturn(txn); manager.begin(); manager.commit(); try { @@ -163,7 +165,7 @@ public void resetAfterSuccessfulCommitFails() { @Test public void resetAfterAbortSucceeds() { - when(session.newTransaction()).thenReturn(txn); + when(session.newTransaction(Options.fromTransactionOptions())).thenReturn(txn); manager.begin(); doThrow(SpannerExceptionFactory.newSpannerException(ErrorCode.ABORTED, "")).when(txn).commit(); try { @@ -173,14 +175,14 @@ public void resetAfterAbortSucceeds() { assertThat(manager.getState()).isEqualTo(TransactionState.ABORTED); } txn = Mockito.mock(TransactionRunnerImpl.TransactionContextImpl.class); - when(session.newTransaction()).thenReturn(txn); + when(session.newTransaction(Options.fromTransactionOptions())).thenReturn(txn); assertThat(manager.resetForRetry()).isEqualTo(txn); assertThat(manager.getState()).isEqualTo(TransactionState.STARTED); } @Test public void resetAfterErrorFails() { - when(session.newTransaction()).thenReturn(txn); + when(session.newTransaction(Options.fromTransactionOptions())).thenReturn(txn); manager.begin(); doThrow(SpannerExceptionFactory.newSpannerException(ErrorCode.UNKNOWN, "")).when(txn).commit(); try { @@ -199,7 +201,7 @@ public void resetAfterErrorFails() { @Test public void rollbackAfterCommitFails() { - when(session.newTransaction()).thenReturn(txn); + when(session.newTransaction(Options.fromTransactionOptions())).thenReturn(txn); manager.begin(); manager.commit(); try { @@ -212,7 +214,7 @@ public void rollbackAfterCommitFails() { @Test public void commitAfterRollbackFails() { - when(session.newTransaction()).thenReturn(txn); + when(session.newTransaction(Options.fromTransactionOptions())).thenReturn(txn); manager.begin(); manager.rollback(); try { @@ -266,12 +268,12 @@ public ApiFuture answer(InvocationOnMock invocation) { }); when(rpc.commitAsync(Mockito.any(CommitRequest.class), Mockito.anyMap())) .thenAnswer( - new Answer>() { + new Answer>() { @Override - public ApiFuture answer(InvocationOnMock invocation) - throws Throwable { + public ApiFuture answer( + InvocationOnMock invocation) throws Throwable { return ApiFutures.immediateFuture( - CommitResponse.newBuilder() + com.google.spanner.v1.CommitResponse.newBuilder() .setCommitTimestamp( com.google.protobuf.Timestamp.newBuilder() .setSeconds(System.currentTimeMillis() * 1000)) @@ -360,12 +362,12 @@ public com.google.spanner.v1.ResultSet answer(InvocationOnMock invocation) }); when(rpc.commitAsync(Mockito.any(CommitRequest.class), Mockito.anyMap())) .thenAnswer( - new Answer>() { + new Answer>() { @Override - public ApiFuture answer(InvocationOnMock invocation) - throws Throwable { + public ApiFuture answer( + InvocationOnMock invocation) throws Throwable { return ApiFutures.immediateFuture( - CommitResponse.newBuilder() + com.google.spanner.v1.CommitResponse.newBuilder() .setCommitTimestamp( com.google.protobuf.Timestamp.newBuilder() .setSeconds(System.currentTimeMillis() * 1000)) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java index 71a34950bbd..56628e2d166 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java @@ -101,7 +101,7 @@ public void release(ScheduledExecutorService exec) { public void setUp() { MockitoAnnotations.initMocks(this); firstRun = true; - when(session.newTransaction()).thenReturn(txn); + when(session.newTransaction(Options.fromTransactionOptions())).thenReturn(txn); when(rpc.executeQuery(Mockito.any(ExecuteSqlRequest.class), Mockito.anyMap())) .thenAnswer( new Answer() { @@ -123,7 +123,7 @@ public ResultSet answer(InvocationOnMock invocation) throws Throwable { return builder.build(); } }); - transactionRunner = new TransactionRunnerImpl(session, rpc, 1); + transactionRunner = new TransactionRunnerImpl(session, Options.fromTransactionOptions()); when(rpc.commitAsync(Mockito.any(CommitRequest.class), Mockito.anyMap())) .thenReturn( ApiFutures.immediateFuture( @@ -322,7 +322,8 @@ public void prepareReadWriteTransaction() { } }; session.setCurrentSpan(mock(Span.class)); - TransactionRunnerImpl runner = new TransactionRunnerImpl(session, rpc, 10); + TransactionRunnerImpl runner = + new TransactionRunnerImpl(session, Options.fromTransactionOptions()); runner.setSpan(mock(Span.class)); assertThat(usedInlinedBegin).isFalse(); runner.run( @@ -349,12 +350,13 @@ private long[] batchDmlException(int status) { .setTransactionId(ByteString.copyFromUtf8(UUID.randomUUID().toString())) .setRpc(rpc) .build(); - when(session.newTransaction()).thenReturn(transaction); + when(session.newTransaction(Options.fromTransactionOptions())).thenReturn(transaction); when(session.beginTransactionAsync()) .thenReturn( ApiFutures.immediateFuture(ByteString.copyFromUtf8(UUID.randomUUID().toString()))); when(session.getName()).thenReturn(SessionId.of("p", "i", "d", "test").getName()); - TransactionRunnerImpl runner = new TransactionRunnerImpl(session, rpc, 10); + TransactionRunnerImpl runner = + new TransactionRunnerImpl(session, Options.fromTransactionOptions()); runner.setSpan(mock(Span.class)); ExecuteBatchDmlResponse response1 = ExecuteBatchDmlResponse.newBuilder() diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java index 88f942122a9..79b09011f44 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java @@ -37,6 +37,7 @@ import com.google.api.gax.longrunning.OperationFuture; import com.google.cloud.NoCredentials; import com.google.cloud.Timestamp; +import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.ForwardingResultSet; @@ -84,7 +85,7 @@ public class ConnectionImplTest { static class SimpleTransactionManager implements TransactionManager { private TransactionState state; - private Timestamp commitTimestamp; + private CommitResponse commitResponse; private TransactionContext txContext; private SimpleTransactionManager(TransactionContext txContext) { @@ -99,7 +100,9 @@ public TransactionContext begin() { @Override public void commit() { - commitTimestamp = Timestamp.now(); + Timestamp commitTimestamp = Timestamp.now(); + commitResponse = mock(CommitResponse.class); + when(commitResponse.getCommitTimestamp()).thenReturn(commitTimestamp); state = TransactionState.COMMITTED; } @@ -115,7 +118,12 @@ public TransactionContext resetForRetry() { @Override public Timestamp getCommitTimestamp() { - return commitTimestamp; + return commitResponse == null ? null : commitResponse.getCommitTimestamp(); + } + + @Override + public CommitResponse getCommitResponse() { + return commitResponse; } @Override @@ -317,11 +325,13 @@ public Timestamp answer(InvocationOnMock invocation) { public TransactionRunner answer(InvocationOnMock invocation) { TransactionRunner runner = new TransactionRunner() { - private Timestamp commitTimestamp; + private CommitResponse commitResponse; @Override public T run(TransactionCallable callable) { - this.commitTimestamp = Timestamp.now(); + Timestamp commitTimestamp = Timestamp.now(); + commitResponse = mock(CommitResponse.class); + when(commitResponse.getCommitTimestamp()).thenReturn(commitTimestamp); TransactionContext tx = mock(TransactionContext.class); when(tx.executeUpdate(Statement.of(UPDATE))).thenReturn(1L); try { @@ -333,7 +343,12 @@ public T run(TransactionCallable callable) { @Override public Timestamp getCommitTimestamp() { - return commitTimestamp; + return commitResponse == null ? null : commitResponse.getCommitTimestamp(); + } + + @Override + public CommitResponse getCommitResponse() { + return commitResponse; } @Override diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadWriteTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadWriteTransactionTest.java index 1e094eaeb6f..e6138e0f16b 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadWriteTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadWriteTransactionTest.java @@ -32,6 +32,7 @@ import com.google.cloud.Timestamp; import com.google.cloud.spanner.AbortedException; +import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.ReadContext.QueryAnalyzeMode; @@ -69,7 +70,7 @@ private enum CommitBehavior { private static class SimpleTransactionManager implements TransactionManager { private TransactionState state; - private Timestamp commitTimestamp; + private CommitResponse commitResponse; private TransactionContext txContext; private CommitBehavior commitBehavior; @@ -88,7 +89,8 @@ public TransactionContext begin() { public void commit() { switch (commitBehavior) { case SUCCEED: - commitTimestamp = Timestamp.now(); + commitResponse = mock(CommitResponse.class); + when(commitResponse.getCommitTimestamp()).thenReturn(Timestamp.now()); state = TransactionState.COMMITTED; break; case FAIL: @@ -115,7 +117,11 @@ public TransactionContext resetForRetry() { @Override public Timestamp getCommitTimestamp() { - return commitTimestamp; + return commitResponse == null ? null : commitResponse.getCommitTimestamp(); + } + + public CommitResponse getCommitResponse() { + return commitResponse; } @Override diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java index 76ef62a21a1..12ebf81e17c 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java @@ -29,6 +29,7 @@ import com.google.api.gax.longrunning.OperationFuture; import com.google.cloud.Timestamp; import com.google.cloud.spanner.AsyncResultSet; +import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.Key; @@ -97,7 +98,7 @@ static StatementTimeout timeout(long timeout, TimeUnit unit) { private static class SimpleTransactionManager implements TransactionManager { private TransactionState state; - private Timestamp commitTimestamp; + private CommitResponse commitResponse; private TransactionContext txContext; private CommitBehavior commitBehavior; @@ -116,7 +117,9 @@ public TransactionContext begin() { public void commit() { switch (commitBehavior) { case SUCCEED: - commitTimestamp = Timestamp.now(); + Timestamp commitTimestamp = Timestamp.now(); + commitResponse = mock(CommitResponse.class); + when(commitResponse.getCommitTimestamp()).thenReturn(commitTimestamp); state = TransactionState.COMMITTED; break; case FAIL: @@ -143,7 +146,12 @@ public TransactionContext resetForRetry() { @Override public Timestamp getCommitTimestamp() { - return commitTimestamp; + return commitResponse.getCommitTimestamp(); + } + + @Override + public CommitResponse getCommitResponse() { + return commitResponse; } @Override @@ -387,7 +395,7 @@ public Long answer(InvocationOnMock invocation) throws Throwable { public TransactionRunner answer(InvocationOnMock invocation) { TransactionRunner runner = new TransactionRunner() { - private Timestamp commitTimestamp; + private CommitResponse commitResponse; @Override public T run(TransactionCallable callable) { @@ -398,7 +406,9 @@ public T run(TransactionCallable callable) { } catch (Exception e) { throw SpannerExceptionFactory.newSpannerException(e); } - this.commitTimestamp = Timestamp.now(); + Timestamp commitTimestamp = Timestamp.now(); + commitResponse = mock(CommitResponse.class); + when(commitResponse.getCommitTimestamp()).thenReturn(commitTimestamp); return res; } else if (commitBehavior == CommitBehavior.FAIL) { throw SpannerExceptionFactory.newSpannerException( @@ -411,10 +421,17 @@ public T run(TransactionCallable callable) { @Override public Timestamp getCommitTimestamp() { - if (commitTimestamp == null) { + if (commitResponse == null) { throw new IllegalStateException("no commit timestamp"); } - return commitTimestamp; + return commitResponse.getCommitTimestamp(); + } + + public CommitResponse getCommitResponse() { + if (commitResponse == null) { + throw new IllegalStateException("no commit response"); + } + return commitResponse; } @Override diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java index 721536cb6b3..d08e6b3f666 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java @@ -16,15 +16,21 @@ package com.google.cloud.spanner.it; +import static com.google.cloud.spanner.SpannerApiFutures.get; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; import com.google.api.core.ApiFuture; +import com.google.api.core.ApiFutures; +import com.google.cloud.spanner.AbortedException; import com.google.cloud.spanner.AsyncResultSet; import com.google.cloud.spanner.AsyncResultSet.CallbackResponse; import com.google.cloud.spanner.AsyncResultSet.ReadyCallback; import com.google.cloud.spanner.AsyncRunner; import com.google.cloud.spanner.AsyncRunner.AsyncWork; +import com.google.cloud.spanner.AsyncTransactionManager; +import com.google.cloud.spanner.AsyncTransactionManager.AsyncTransactionFunction; +import com.google.cloud.spanner.AsyncTransactionManager.TransactionContextFuture; import com.google.cloud.spanner.Database; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.DatabaseId; @@ -35,6 +41,7 @@ import com.google.cloud.spanner.KeyRange; import com.google.cloud.spanner.KeySet; import com.google.cloud.spanner.Mutation; +import com.google.cloud.spanner.Options; import com.google.cloud.spanner.SpannerException; import com.google.cloud.spanner.Statement; import com.google.cloud.spanner.Struct; @@ -51,6 +58,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.junit.AfterClass; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; @@ -86,7 +94,17 @@ public static void setUpDatabase() { "CREATE INDEX TestTableByValue ON TestTable(StringValue)", "CREATE INDEX TestTableByValueDesc ON TestTable(StringValue DESC)"); client = env.getTestHelper().getDatabaseClient(db); + executor = Executors.newSingleThreadExecutor(); + } + @AfterClass + public static void cleanup() { + executor.shutdown(); + } + + @Before + public void setupData() { + client.write(Arrays.asList(Mutation.delete(TABLE_NAME, KeySet.all()))); // Includes k0..k14. Note that strings k{10,14} sort between k1 and k2. List mutations = new ArrayList<>(); for (int i = 0; i < 15; ++i) { @@ -99,12 +117,6 @@ public static void setUpDatabase() { .build()); } client.write(mutations); - executor = Executors.newSingleThreadExecutor(); - } - - @AfterClass - public static void cleanup() { - executor.shutdown(); } @Test @@ -302,4 +314,63 @@ public ApiFuture doWorkAsync(TransactionContext txn) { assertThat(client.singleUse().readRow("TestTable", Key.of("k999"), ALL_COLUMNS)).isNull(); } } + + @Test + public void asyncRunnerReturnsCommitStats() { + AsyncRunner runner = client.runAsync(Options.commitStats()); + runner.runAsync( + new AsyncWork() { + @Override + public ApiFuture doWorkAsync(TransactionContext txn) { + txn.buffer( + Mutation.newInsertOrUpdateBuilder(TABLE_NAME) + .set("Key") + .to("k_commit_stats") + .set("StringValue") + .to("Should return commit stats") + .build()); + return ApiFutures.immediateFuture(null); + } + }, + executor); + assertThat(get(runner.getCommitResponse()).getCommitStats()).isNotNull(); + // MutationCount = 2 columns + 2 secondary indexes. + assertThat(get(runner.getCommitResponse()).getCommitStats().getMutationCount()).isEqualTo(4L); + } + + @Test + public void asyncTransactionManagerReturnsCommitStats() throws InterruptedException { + try (AsyncTransactionManager mgr = client.transactionManagerAsync(Options.commitStats())) { + TransactionContextFuture ctx = mgr.beginAsync(); + while (true) { + try { + get( + ctx.then( + new AsyncTransactionFunction() { + @Override + public ApiFuture apply(TransactionContext txn, Void input) + throws Exception { + txn.buffer( + Mutation.newInsertOrUpdateBuilder(TABLE_NAME) + .set("Key") + .to("k_commit_stats") + .set("StringValue") + .to("Should return commit stats") + .build()); + return ApiFutures.immediateFuture(null); + } + }, + executor) + .commitAsync()); + assertThat(get(mgr.getCommitResponse()).getCommitStats()).isNotNull(); + assertThat(get(mgr.getCommitResponse()).getCommitStats().getMutationCount()) + .isEqualTo(4L); + break; + } catch (AbortedException e) { + Thread.sleep(e.getRetryDelayInMillis() / 1000); + ctx = mgr.resetForRetryAsync(); + } + } + } + } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java index 4d65af67ed0..5b43eef8548 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java @@ -29,6 +29,7 @@ import com.google.cloud.spanner.Key; import com.google.cloud.spanner.KeySet; import com.google.cloud.spanner.Mutation; +import com.google.cloud.spanner.Options; import com.google.cloud.spanner.ParallelIntegrationTest; import com.google.cloud.spanner.SpannerException; import com.google.cloud.spanner.Struct; @@ -212,4 +213,30 @@ public void abortAndRetry() throws InterruptedException { manager2.close(); } } + + @SuppressWarnings("resource") + @Test + public void transactionManagerReturnsCommitStats() throws InterruptedException { + try (TransactionManager manager = client.transactionManager(Options.commitStats())) { + TransactionContext txn = manager.begin(); + while (true) { + txn.buffer( + Mutation.newInsertBuilder("T") + .set("K") + .to("KeyCommitStats") + .set("BoolValue") + .to(true) + .build()); + try { + manager.commit(); + assertThat(manager.getCommitResponse().getCommitStats()).isNotNull(); + assertThat(manager.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); + break; + } catch (AbortedException e) { + Thread.sleep(e.getRetryDelayInMillis() / 1000); + txn = manager.resetForRetry(); + } + } + } + } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java index 503f0ddf908..5a0c8dc7e38 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java @@ -33,6 +33,7 @@ import com.google.cloud.spanner.Key; import com.google.cloud.spanner.KeySet; import com.google.cloud.spanner.Mutation; +import com.google.cloud.spanner.Options; import com.google.cloud.spanner.ParallelIntegrationTest; import com.google.cloud.spanner.PartitionOptions; import com.google.cloud.spanner.ReadContext; @@ -630,4 +631,22 @@ public Long run(TransactionContext transaction) throws Exception { assertThat(e.getErrorCode()).isEqualTo(ErrorCode.INVALID_ARGUMENT); } } + + @Test + public void transactionRunnerReturnsCommitStats() { + final String key = uniqueKey(); + TransactionRunner runner = client.readWriteTransaction(Options.commitStats()); + runner.run( + new TransactionCallable() { + @Override + public Void run(TransactionContext transaction) throws Exception { + transaction.buffer( + Mutation.newInsertBuilder("T").set("K").to(key).set("V").to(0).build()); + return null; + } + }); + assertThat(runner.getCommitResponse().getCommitStats()).isNotNull(); + // MutationCount = 2 (2 columns). + assertThat(runner.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); + } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java index 6f11fc6b438..9dd04e3dd8d 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java @@ -25,6 +25,7 @@ import com.google.cloud.ByteArray; import com.google.cloud.Date; import com.google.cloud.Timestamp; +import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.Database; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.ErrorCode; @@ -32,6 +33,7 @@ import com.google.cloud.spanner.Key; import com.google.cloud.spanner.KeySet; import com.google.cloud.spanner.Mutation; +import com.google.cloud.spanner.Options; import com.google.cloud.spanner.ParallelIntegrationTest; import com.google.cloud.spanner.ResultSet; import com.google.cloud.spanner.SpannerException; @@ -157,6 +159,42 @@ public void writeAtLeastOnce() { assertThat(row.getString(0)).isEqualTo("v1"); } + @Test + public void writeReturnsCommitStats() { + CommitResponse response = + client.writeWithOptions( + Arrays.asList( + Mutation.newInsertOrUpdateBuilder("T") + .set("K") + .to(lastKey = uniqueString()) + .set("StringValue") + .to("v1") + .build()), + Options.commitStats()); + assertThat(response).isNotNull(); + assertThat(response.getCommitTimestamp()).isNotNull(); + assertThat(response.getCommitStats()).isNotNull(); + assertThat(response.getCommitStats().getMutationCount()).isEqualTo(2L); + } + + @Test + public void writeAtLeastOnceReturnsCommitStats() { + CommitResponse response = + client.writeAtLeastOnceWithOptions( + Arrays.asList( + Mutation.newInsertOrUpdateBuilder("T") + .set("K") + .to(lastKey = uniqueString()) + .set("StringValue") + .to("v1") + .build()), + Options.commitStats()); + assertThat(response).isNotNull(); + assertThat(response.getCommitTimestamp()).isNotNull(); + assertThat(response.getCommitStats()).isNotNull(); + assertThat(response.getCommitStats().getMutationCount()).isEqualTo(2L); + } + @Test public void writeAlreadyExists() { client.write( 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 f322ec04c09..1ba7b235bbb 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 @@ -111,6 +111,11 @@ private CommitRequest( input.readMessage(com.google.spanner.v1.Mutation.parser(), extensionRegistry)); break; } + case 40: + { + returnCommitStats_ = input.readBool(); + break; + } default: { if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { @@ -422,6 +427,26 @@ public com.google.spanner.v1.MutationOrBuilder getMutationsOrBuilder(int index) return mutations_.get(index); } + public static final int RETURN_COMMIT_STATS_FIELD_NUMBER = 5; + private boolean returnCommitStats_; + /** + * + * + *
+   * If `true`, then statistics related to the transaction will be included in
+   * the [CommitResponse][google.spanner.v1.CommitResponse.commit_stats]. Default value is
+   * `false`.
+   * 
+ * + * bool return_commit_stats = 5; + * + * @return The returnCommitStats. + */ + @java.lang.Override + public boolean getReturnCommitStats() { + return returnCommitStats_; + } + private byte memoizedIsInitialized = -1; @java.lang.Override @@ -448,6 +473,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io for (int i = 0; i < mutations_.size(); i++) { output.writeMessage(4, mutations_.get(i)); } + if (returnCommitStats_ != false) { + output.writeBool(5, returnCommitStats_); + } unknownFields.writeTo(output); } @@ -473,6 +501,9 @@ public int getSerializedSize() { for (int i = 0; i < mutations_.size(); i++) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, mutations_.get(i)); } + if (returnCommitStats_ != false) { + size += com.google.protobuf.CodedOutputStream.computeBoolSize(5, returnCommitStats_); + } size += unknownFields.getSerializedSize(); memoizedSize = size; return size; @@ -490,6 +521,7 @@ public boolean equals(final java.lang.Object obj) { if (!getSession().equals(other.getSession())) return false; if (!getMutationsList().equals(other.getMutationsList())) return false; + if (getReturnCommitStats() != other.getReturnCommitStats()) return false; if (!getTransactionCase().equals(other.getTransactionCase())) return false; switch (transactionCase_) { case 2: @@ -518,6 +550,8 @@ public int hashCode() { hash = (37 * hash) + MUTATIONS_FIELD_NUMBER; hash = (53 * hash) + getMutationsList().hashCode(); } + hash = (37 * hash) + RETURN_COMMIT_STATS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getReturnCommitStats()); switch (transactionCase_) { case 2: hash = (37 * hash) + TRANSACTION_ID_FIELD_NUMBER; @@ -684,6 +718,8 @@ public Builder clear() { } else { mutationsBuilder_.clear(); } + returnCommitStats_ = false; + transactionCase_ = 0; transaction_ = null; return this; @@ -733,6 +769,7 @@ public com.google.spanner.v1.CommitRequest buildPartial() { } else { result.mutations_ = mutationsBuilder_.build(); } + result.returnCommitStats_ = returnCommitStats_; result.transactionCase_ = transactionCase_; onBuilt(); return result; @@ -814,6 +851,9 @@ public Builder mergeFrom(com.google.spanner.v1.CommitRequest other) { } } } + if (other.getReturnCommitStats() != false) { + setReturnCommitStats(other.getReturnCommitStats()); + } switch (other.getTransactionCase()) { case TRANSACTION_ID: { @@ -1712,6 +1752,64 @@ public java.util.List getMutationsBuilde return mutationsBuilder_; } + private boolean returnCommitStats_; + /** + * + * + *
+     * If `true`, then statistics related to the transaction will be included in
+     * the [CommitResponse][google.spanner.v1.CommitResponse.commit_stats]. Default value is
+     * `false`.
+     * 
+ * + * bool return_commit_stats = 5; + * + * @return The returnCommitStats. + */ + @java.lang.Override + public boolean getReturnCommitStats() { + return returnCommitStats_; + } + /** + * + * + *
+     * If `true`, then statistics related to the transaction will be included in
+     * the [CommitResponse][google.spanner.v1.CommitResponse.commit_stats]. Default value is
+     * `false`.
+     * 
+ * + * bool return_commit_stats = 5; + * + * @param value The returnCommitStats to set. + * @return This builder for chaining. + */ + public Builder setReturnCommitStats(boolean value) { + + returnCommitStats_ = value; + onChanged(); + return this; + } + /** + * + * + *
+     * If `true`, then statistics related to the transaction will be included in
+     * the [CommitResponse][google.spanner.v1.CommitResponse.commit_stats]. Default value is
+     * `false`.
+     * 
+ * + * bool return_commit_stats = 5; + * + * @return This builder for chaining. + */ + public Builder clearReturnCommitStats() { + + returnCommitStats_ = false; + onChanged(); + return this; + } + @java.lang.Override public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { return super.setUnknownFields(unknownFields); diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitRequestOrBuilder.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitRequestOrBuilder.java index bb0f6c6acdd..a32fa4b4396 100644 --- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitRequestOrBuilder.java +++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitRequestOrBuilder.java @@ -185,5 +185,20 @@ public interface CommitRequestOrBuilder */ com.google.spanner.v1.MutationOrBuilder getMutationsOrBuilder(int index); + /** + * + * + *
+   * If `true`, then statistics related to the transaction will be included in
+   * the [CommitResponse][google.spanner.v1.CommitResponse.commit_stats]. Default value is
+   * `false`.
+   * 
+ * + * bool return_commit_stats = 5; + * + * @return The returnCommitStats. + */ + boolean getReturnCommitStats(); + public com.google.spanner.v1.CommitRequest.TransactionCase getTransactionCase(); } 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 28772858452..53f457c9ef2 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 @@ -81,6 +81,22 @@ private CommitResponse( commitTimestamp_ = subBuilder.buildPartial(); } + break; + } + case 18: + { + com.google.spanner.v1.CommitResponse.CommitStats.Builder subBuilder = null; + if (commitStats_ != null) { + subBuilder = commitStats_.toBuilder(); + } + commitStats_ = + input.readMessage( + com.google.spanner.v1.CommitResponse.CommitStats.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(commitStats_); + commitStats_ = subBuilder.buildPartial(); + } + break; } default: @@ -117,6 +133,867 @@ public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { com.google.spanner.v1.CommitResponse.Builder.class); } + public interface CommitStatsOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.v1.CommitResponse.CommitStats) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
+     * The total number of the mutations for the transaction.
+     * 
+ * + * int64 mutation_count = 1; + * + * @return The mutationCount. + */ + long getMutationCount(); + + /** + * + * + *
+     * Length of time the commit was delayed due to overloaded servers.
+     * 
+ * + * .google.protobuf.Duration overload_delay = 2; + * + * @return Whether the overloadDelay field is set. + */ + boolean hasOverloadDelay(); + /** + * + * + *
+     * Length of time the commit was delayed due to overloaded servers.
+     * 
+ * + * .google.protobuf.Duration overload_delay = 2; + * + * @return The overloadDelay. + */ + com.google.protobuf.Duration getOverloadDelay(); + /** + * + * + *
+     * Length of time the commit was delayed due to overloaded servers.
+     * 
+ * + * .google.protobuf.Duration overload_delay = 2; + */ + com.google.protobuf.DurationOrBuilder getOverloadDelayOrBuilder(); + } + /** + * + * + *
+   * Additional statistics about a commit.
+   * 
+ * + * Protobuf type {@code google.spanner.v1.CommitResponse.CommitStats} + */ + public static final class CommitStats extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.v1.CommitResponse.CommitStats) + CommitStatsOrBuilder { + private static final long serialVersionUID = 0L; + // Use CommitStats.newBuilder() to construct. + private CommitStats(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private CommitStats() {} + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new CommitStats(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private CommitStats( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: + { + mutationCount_ = input.readInt64(); + break; + } + case 18: + { + com.google.protobuf.Duration.Builder subBuilder = null; + if (overloadDelay_ != null) { + subBuilder = overloadDelay_.toBuilder(); + } + overloadDelay_ = + input.readMessage(com.google.protobuf.Duration.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(overloadDelay_); + overloadDelay_ = subBuilder.buildPartial(); + } + + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.spanner.v1.SpannerProto + .internal_static_google_spanner_v1_CommitResponse_CommitStats_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.spanner.v1.SpannerProto + .internal_static_google_spanner_v1_CommitResponse_CommitStats_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.spanner.v1.CommitResponse.CommitStats.class, + com.google.spanner.v1.CommitResponse.CommitStats.Builder.class); + } + + public static final int MUTATION_COUNT_FIELD_NUMBER = 1; + private long mutationCount_; + /** + * + * + *
+     * The total number of the mutations for the transaction.
+     * 
+ * + * int64 mutation_count = 1; + * + * @return The mutationCount. + */ + @java.lang.Override + public long getMutationCount() { + return mutationCount_; + } + + public static final int OVERLOAD_DELAY_FIELD_NUMBER = 2; + private com.google.protobuf.Duration overloadDelay_; + /** + * + * + *
+     * Length of time the commit was delayed due to overloaded servers.
+     * 
+ * + * .google.protobuf.Duration overload_delay = 2; + * + * @return Whether the overloadDelay field is set. + */ + @java.lang.Override + public boolean hasOverloadDelay() { + return overloadDelay_ != null; + } + /** + * + * + *
+     * Length of time the commit was delayed due to overloaded servers.
+     * 
+ * + * .google.protobuf.Duration overload_delay = 2; + * + * @return The overloadDelay. + */ + @java.lang.Override + public com.google.protobuf.Duration getOverloadDelay() { + return overloadDelay_ == null + ? com.google.protobuf.Duration.getDefaultInstance() + : overloadDelay_; + } + /** + * + * + *
+     * Length of time the commit was delayed due to overloaded servers.
+     * 
+ * + * .google.protobuf.Duration overload_delay = 2; + */ + @java.lang.Override + public com.google.protobuf.DurationOrBuilder getOverloadDelayOrBuilder() { + return getOverloadDelay(); + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (mutationCount_ != 0L) { + output.writeInt64(1, mutationCount_); + } + if (overloadDelay_ != null) { + output.writeMessage(2, getOverloadDelay()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (mutationCount_ != 0L) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(1, mutationCount_); + } + if (overloadDelay_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getOverloadDelay()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.spanner.v1.CommitResponse.CommitStats)) { + return super.equals(obj); + } + com.google.spanner.v1.CommitResponse.CommitStats other = + (com.google.spanner.v1.CommitResponse.CommitStats) obj; + + if (getMutationCount() != other.getMutationCount()) return false; + if (hasOverloadDelay() != other.hasOverloadDelay()) return false; + if (hasOverloadDelay()) { + if (!getOverloadDelay().equals(other.getOverloadDelay())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + MUTATION_COUNT_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getMutationCount()); + if (hasOverloadDelay()) { + hash = (37 * hash) + OVERLOAD_DELAY_FIELD_NUMBER; + hash = (53 * hash) + getOverloadDelay().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.spanner.v1.CommitResponse.CommitStats parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.spanner.v1.CommitResponse.CommitStats parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.spanner.v1.CommitResponse.CommitStats parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.spanner.v1.CommitResponse.CommitStats parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.spanner.v1.CommitResponse.CommitStats parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.spanner.v1.CommitResponse.CommitStats parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.spanner.v1.CommitResponse.CommitStats parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.spanner.v1.CommitResponse.CommitStats parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.spanner.v1.CommitResponse.CommitStats parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.spanner.v1.CommitResponse.CommitStats parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.spanner.v1.CommitResponse.CommitStats parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.spanner.v1.CommitResponse.CommitStats parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(com.google.spanner.v1.CommitResponse.CommitStats prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
+     * Additional statistics about a commit.
+     * 
+ * + * Protobuf type {@code google.spanner.v1.CommitResponse.CommitStats} + */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.v1.CommitResponse.CommitStats) + com.google.spanner.v1.CommitResponse.CommitStatsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.spanner.v1.SpannerProto + .internal_static_google_spanner_v1_CommitResponse_CommitStats_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.spanner.v1.SpannerProto + .internal_static_google_spanner_v1_CommitResponse_CommitStats_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.spanner.v1.CommitResponse.CommitStats.class, + com.google.spanner.v1.CommitResponse.CommitStats.Builder.class); + } + + // Construct using com.google.spanner.v1.CommitResponse.CommitStats.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {} + } + + @java.lang.Override + public Builder clear() { + super.clear(); + mutationCount_ = 0L; + + if (overloadDelayBuilder_ == null) { + overloadDelay_ = null; + } else { + overloadDelay_ = null; + overloadDelayBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.spanner.v1.SpannerProto + .internal_static_google_spanner_v1_CommitResponse_CommitStats_descriptor; + } + + @java.lang.Override + public com.google.spanner.v1.CommitResponse.CommitStats getDefaultInstanceForType() { + return com.google.spanner.v1.CommitResponse.CommitStats.getDefaultInstance(); + } + + @java.lang.Override + public com.google.spanner.v1.CommitResponse.CommitStats build() { + com.google.spanner.v1.CommitResponse.CommitStats result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.spanner.v1.CommitResponse.CommitStats buildPartial() { + com.google.spanner.v1.CommitResponse.CommitStats result = + new com.google.spanner.v1.CommitResponse.CommitStats(this); + result.mutationCount_ = mutationCount_; + if (overloadDelayBuilder_ == null) { + result.overloadDelay_ = overloadDelay_; + } else { + result.overloadDelay_ = overloadDelayBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, + java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.spanner.v1.CommitResponse.CommitStats) { + return mergeFrom((com.google.spanner.v1.CommitResponse.CommitStats) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.spanner.v1.CommitResponse.CommitStats other) { + if (other == com.google.spanner.v1.CommitResponse.CommitStats.getDefaultInstance()) + return this; + if (other.getMutationCount() != 0L) { + setMutationCount(other.getMutationCount()); + } + if (other.hasOverloadDelay()) { + mergeOverloadDelay(other.getOverloadDelay()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.google.spanner.v1.CommitResponse.CommitStats parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = + (com.google.spanner.v1.CommitResponse.CommitStats) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private long mutationCount_; + /** + * + * + *
+       * The total number of the mutations for the transaction.
+       * 
+ * + * int64 mutation_count = 1; + * + * @return The mutationCount. + */ + @java.lang.Override + public long getMutationCount() { + return mutationCount_; + } + /** + * + * + *
+       * The total number of the mutations for the transaction.
+       * 
+ * + * int64 mutation_count = 1; + * + * @param value The mutationCount to set. + * @return This builder for chaining. + */ + public Builder setMutationCount(long value) { + + mutationCount_ = value; + onChanged(); + return this; + } + /** + * + * + *
+       * The total number of the mutations for the transaction.
+       * 
+ * + * int64 mutation_count = 1; + * + * @return This builder for chaining. + */ + public Builder clearMutationCount() { + + mutationCount_ = 0L; + onChanged(); + return this; + } + + private com.google.protobuf.Duration overloadDelay_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Duration, + com.google.protobuf.Duration.Builder, + com.google.protobuf.DurationOrBuilder> + overloadDelayBuilder_; + /** + * + * + *
+       * Length of time the commit was delayed due to overloaded servers.
+       * 
+ * + * .google.protobuf.Duration overload_delay = 2; + * + * @return Whether the overloadDelay field is set. + */ + public boolean hasOverloadDelay() { + return overloadDelayBuilder_ != null || overloadDelay_ != null; + } + /** + * + * + *
+       * Length of time the commit was delayed due to overloaded servers.
+       * 
+ * + * .google.protobuf.Duration overload_delay = 2; + * + * @return The overloadDelay. + */ + public com.google.protobuf.Duration getOverloadDelay() { + if (overloadDelayBuilder_ == null) { + return overloadDelay_ == null + ? com.google.protobuf.Duration.getDefaultInstance() + : overloadDelay_; + } else { + return overloadDelayBuilder_.getMessage(); + } + } + /** + * + * + *
+       * Length of time the commit was delayed due to overloaded servers.
+       * 
+ * + * .google.protobuf.Duration overload_delay = 2; + */ + public Builder setOverloadDelay(com.google.protobuf.Duration value) { + if (overloadDelayBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + overloadDelay_ = value; + onChanged(); + } else { + overloadDelayBuilder_.setMessage(value); + } + + return this; + } + /** + * + * + *
+       * Length of time the commit was delayed due to overloaded servers.
+       * 
+ * + * .google.protobuf.Duration overload_delay = 2; + */ + public Builder setOverloadDelay(com.google.protobuf.Duration.Builder builderForValue) { + if (overloadDelayBuilder_ == null) { + overloadDelay_ = builderForValue.build(); + onChanged(); + } else { + overloadDelayBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * + * + *
+       * Length of time the commit was delayed due to overloaded servers.
+       * 
+ * + * .google.protobuf.Duration overload_delay = 2; + */ + public Builder mergeOverloadDelay(com.google.protobuf.Duration value) { + if (overloadDelayBuilder_ == null) { + if (overloadDelay_ != null) { + overloadDelay_ = + com.google.protobuf.Duration.newBuilder(overloadDelay_) + .mergeFrom(value) + .buildPartial(); + } else { + overloadDelay_ = value; + } + onChanged(); + } else { + overloadDelayBuilder_.mergeFrom(value); + } + + return this; + } + /** + * + * + *
+       * Length of time the commit was delayed due to overloaded servers.
+       * 
+ * + * .google.protobuf.Duration overload_delay = 2; + */ + public Builder clearOverloadDelay() { + if (overloadDelayBuilder_ == null) { + overloadDelay_ = null; + onChanged(); + } else { + overloadDelay_ = null; + overloadDelayBuilder_ = null; + } + + return this; + } + /** + * + * + *
+       * Length of time the commit was delayed due to overloaded servers.
+       * 
+ * + * .google.protobuf.Duration overload_delay = 2; + */ + public com.google.protobuf.Duration.Builder getOverloadDelayBuilder() { + + onChanged(); + return getOverloadDelayFieldBuilder().getBuilder(); + } + /** + * + * + *
+       * Length of time the commit was delayed due to overloaded servers.
+       * 
+ * + * .google.protobuf.Duration overload_delay = 2; + */ + public com.google.protobuf.DurationOrBuilder getOverloadDelayOrBuilder() { + if (overloadDelayBuilder_ != null) { + return overloadDelayBuilder_.getMessageOrBuilder(); + } else { + return overloadDelay_ == null + ? com.google.protobuf.Duration.getDefaultInstance() + : overloadDelay_; + } + } + /** + * + * + *
+       * Length of time the commit was delayed due to overloaded servers.
+       * 
+ * + * .google.protobuf.Duration overload_delay = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Duration, + com.google.protobuf.Duration.Builder, + com.google.protobuf.DurationOrBuilder> + getOverloadDelayFieldBuilder() { + if (overloadDelayBuilder_ == null) { + overloadDelayBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Duration, + com.google.protobuf.Duration.Builder, + com.google.protobuf.DurationOrBuilder>( + getOverloadDelay(), getParentForChildren(), isClean()); + overloadDelay_ = null; + } + return overloadDelayBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.spanner.v1.CommitResponse.CommitStats) + } + + // @@protoc_insertion_point(class_scope:google.spanner.v1.CommitResponse.CommitStats) + private static final com.google.spanner.v1.CommitResponse.CommitStats DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.spanner.v1.CommitResponse.CommitStats(); + } + + public static com.google.spanner.v1.CommitResponse.CommitStats getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CommitStats parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CommitStats(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.spanner.v1.CommitResponse.CommitStats getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + public static final int COMMIT_TIMESTAMP_FIELD_NUMBER = 1; private com.google.protobuf.Timestamp commitTimestamp_; /** @@ -165,6 +1042,60 @@ public com.google.protobuf.TimestampOrBuilder getCommitTimestampOrBuilder() { return getCommitTimestamp(); } + public static final int COMMIT_STATS_FIELD_NUMBER = 2; + private com.google.spanner.v1.CommitResponse.CommitStats commitStats_; + /** + * + * + *
+   * The statistics about this Commit. Not returned by default.
+   * For more information, see
+   * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+   * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + * + * @return Whether the commitStats field is set. + */ + @java.lang.Override + public boolean hasCommitStats() { + return commitStats_ != null; + } + /** + * + * + *
+   * The statistics about this Commit. Not returned by default.
+   * For more information, see
+   * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+   * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + * + * @return The commitStats. + */ + @java.lang.Override + public com.google.spanner.v1.CommitResponse.CommitStats getCommitStats() { + return commitStats_ == null + ? com.google.spanner.v1.CommitResponse.CommitStats.getDefaultInstance() + : commitStats_; + } + /** + * + * + *
+   * The statistics about this Commit. Not returned by default.
+   * For more information, see
+   * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+   * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + */ + @java.lang.Override + public com.google.spanner.v1.CommitResponse.CommitStatsOrBuilder getCommitStatsOrBuilder() { + return getCommitStats(); + } + private byte memoizedIsInitialized = -1; @java.lang.Override @@ -182,6 +1113,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io if (commitTimestamp_ != null) { output.writeMessage(1, getCommitTimestamp()); } + if (commitStats_ != null) { + output.writeMessage(2, getCommitStats()); + } unknownFields.writeTo(output); } @@ -194,6 +1128,9 @@ public int getSerializedSize() { if (commitTimestamp_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getCommitTimestamp()); } + if (commitStats_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getCommitStats()); + } size += unknownFields.getSerializedSize(); memoizedSize = size; return size; @@ -213,6 +1150,10 @@ public boolean equals(final java.lang.Object obj) { if (hasCommitTimestamp()) { if (!getCommitTimestamp().equals(other.getCommitTimestamp())) return false; } + if (hasCommitStats() != other.hasCommitStats()) return false; + if (hasCommitStats()) { + if (!getCommitStats().equals(other.getCommitStats())) return false; + } if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -228,6 +1169,10 @@ public int hashCode() { hash = (37 * hash) + COMMIT_TIMESTAMP_FIELD_NUMBER; hash = (53 * hash) + getCommitTimestamp().hashCode(); } + if (hasCommitStats()) { + hash = (37 * hash) + COMMIT_STATS_FIELD_NUMBER; + hash = (53 * hash) + getCommitStats().hashCode(); + } hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; @@ -378,6 +1323,12 @@ public Builder clear() { commitTimestamp_ = null; commitTimestampBuilder_ = null; } + if (commitStatsBuilder_ == null) { + commitStats_ = null; + } else { + commitStats_ = null; + commitStatsBuilder_ = null; + } return this; } @@ -409,6 +1360,11 @@ public com.google.spanner.v1.CommitResponse buildPartial() { } else { result.commitTimestamp_ = commitTimestampBuilder_.build(); } + if (commitStatsBuilder_ == null) { + result.commitStats_ = commitStats_; + } else { + result.commitStats_ = commitStatsBuilder_.build(); + } onBuilt(); return result; } @@ -461,6 +1417,9 @@ public Builder mergeFrom(com.google.spanner.v1.CommitResponse other) { if (other.hasCommitTimestamp()) { mergeCommitTimestamp(other.getCommitTimestamp()); } + if (other.hasCommitStats()) { + mergeCommitStats(other.getCommitStats()); + } this.mergeUnknownFields(other.unknownFields); onChanged(); return this; @@ -675,6 +1634,210 @@ public com.google.protobuf.TimestampOrBuilder getCommitTimestampOrBuilder() { return commitTimestampBuilder_; } + private com.google.spanner.v1.CommitResponse.CommitStats commitStats_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.spanner.v1.CommitResponse.CommitStats, + com.google.spanner.v1.CommitResponse.CommitStats.Builder, + com.google.spanner.v1.CommitResponse.CommitStatsOrBuilder> + commitStatsBuilder_; + /** + * + * + *
+     * The statistics about this Commit. Not returned by default.
+     * For more information, see
+     * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+     * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + * + * @return Whether the commitStats field is set. + */ + public boolean hasCommitStats() { + return commitStatsBuilder_ != null || commitStats_ != null; + } + /** + * + * + *
+     * The statistics about this Commit. Not returned by default.
+     * For more information, see
+     * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+     * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + * + * @return The commitStats. + */ + public com.google.spanner.v1.CommitResponse.CommitStats getCommitStats() { + if (commitStatsBuilder_ == null) { + return commitStats_ == null + ? com.google.spanner.v1.CommitResponse.CommitStats.getDefaultInstance() + : commitStats_; + } else { + return commitStatsBuilder_.getMessage(); + } + } + /** + * + * + *
+     * The statistics about this Commit. Not returned by default.
+     * For more information, see
+     * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+     * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + */ + public Builder setCommitStats(com.google.spanner.v1.CommitResponse.CommitStats value) { + if (commitStatsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + commitStats_ = value; + onChanged(); + } else { + commitStatsBuilder_.setMessage(value); + } + + return this; + } + /** + * + * + *
+     * The statistics about this Commit. Not returned by default.
+     * For more information, see
+     * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+     * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + */ + public Builder setCommitStats( + com.google.spanner.v1.CommitResponse.CommitStats.Builder builderForValue) { + if (commitStatsBuilder_ == null) { + commitStats_ = builderForValue.build(); + onChanged(); + } else { + commitStatsBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * + * + *
+     * The statistics about this Commit. Not returned by default.
+     * For more information, see
+     * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+     * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + */ + public Builder mergeCommitStats(com.google.spanner.v1.CommitResponse.CommitStats value) { + if (commitStatsBuilder_ == null) { + if (commitStats_ != null) { + commitStats_ = + com.google.spanner.v1.CommitResponse.CommitStats.newBuilder(commitStats_) + .mergeFrom(value) + .buildPartial(); + } else { + commitStats_ = value; + } + onChanged(); + } else { + commitStatsBuilder_.mergeFrom(value); + } + + return this; + } + /** + * + * + *
+     * The statistics about this Commit. Not returned by default.
+     * For more information, see
+     * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+     * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + */ + public Builder clearCommitStats() { + if (commitStatsBuilder_ == null) { + commitStats_ = null; + onChanged(); + } else { + commitStats_ = null; + commitStatsBuilder_ = null; + } + + return this; + } + /** + * + * + *
+     * The statistics about this Commit. Not returned by default.
+     * For more information, see
+     * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+     * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + */ + public com.google.spanner.v1.CommitResponse.CommitStats.Builder getCommitStatsBuilder() { + + onChanged(); + return getCommitStatsFieldBuilder().getBuilder(); + } + /** + * + * + *
+     * The statistics about this Commit. Not returned by default.
+     * For more information, see
+     * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+     * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + */ + public com.google.spanner.v1.CommitResponse.CommitStatsOrBuilder getCommitStatsOrBuilder() { + if (commitStatsBuilder_ != null) { + return commitStatsBuilder_.getMessageOrBuilder(); + } else { + return commitStats_ == null + ? com.google.spanner.v1.CommitResponse.CommitStats.getDefaultInstance() + : commitStats_; + } + } + /** + * + * + *
+     * The statistics about this Commit. Not returned by default.
+     * For more information, see
+     * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+     * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.spanner.v1.CommitResponse.CommitStats, + com.google.spanner.v1.CommitResponse.CommitStats.Builder, + com.google.spanner.v1.CommitResponse.CommitStatsOrBuilder> + getCommitStatsFieldBuilder() { + if (commitStatsBuilder_ == null) { + commitStatsBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.spanner.v1.CommitResponse.CommitStats, + com.google.spanner.v1.CommitResponse.CommitStats.Builder, + com.google.spanner.v1.CommitResponse.CommitStatsOrBuilder>( + getCommitStats(), getParentForChildren(), isClean()); + commitStats_ = null; + } + return commitStatsBuilder_; + } + @java.lang.Override public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { return super.setUnknownFields(unknownFields); diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitResponseOrBuilder.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitResponseOrBuilder.java index 90c6c6e6729..9ff076ff849 100644 --- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitResponseOrBuilder.java +++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/CommitResponseOrBuilder.java @@ -57,4 +57,45 @@ public interface CommitResponseOrBuilder * .google.protobuf.Timestamp commit_timestamp = 1; */ com.google.protobuf.TimestampOrBuilder getCommitTimestampOrBuilder(); + + /** + * + * + *
+   * The statistics about this Commit. Not returned by default.
+   * For more information, see
+   * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+   * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + * + * @return Whether the commitStats field is set. + */ + boolean hasCommitStats(); + /** + * + * + *
+   * The statistics about this Commit. Not returned by default.
+   * For more information, see
+   * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+   * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + * + * @return The commitStats. + */ + com.google.spanner.v1.CommitResponse.CommitStats getCommitStats(); + /** + * + * + *
+   * The statistics about this Commit. Not returned by default.
+   * For more information, see
+   * [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats].
+   * 
+ * + * .google.spanner.v1.CommitResponse.CommitStats commit_stats = 2; + */ + com.google.spanner.v1.CommitResponse.CommitStatsOrBuilder getCommitStatsOrBuilder(); } diff --git a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/SpannerProto.java b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/SpannerProto.java index 0932ab5d52a..3c5da062957 100644 --- a/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/SpannerProto.java +++ b/proto-google-cloud-spanner-v1/src/main/java/com/google/spanner/v1/SpannerProto.java @@ -131,6 +131,10 @@ public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry r internal_static_google_spanner_v1_CommitResponse_descriptor; static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_google_spanner_v1_CommitResponse_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_v1_CommitResponse_CommitStats_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_v1_CommitResponse_CommitStats_fieldAccessorTable; static final com.google.protobuf.Descriptors.Descriptor internal_static_google_spanner_v1_RollbackRequest_descriptor; static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable @@ -148,198 +152,203 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { + "e.spanner.v1\032\034google/api/annotations.pro" + "to\032\027google/api/client.proto\032\037google/api/" + "field_behavior.proto\032\031google/api/resourc" - + "e.proto\032\033google/protobuf/empty.proto\032\034go" - + "ogle/protobuf/struct.proto\032\037google/proto" - + "buf/timestamp.proto\032\027google/rpc/status.p" - + "roto\032\034google/spanner/v1/keys.proto\032 goog" - + "le/spanner/v1/mutation.proto\032\"google/spa" - + "nner/v1/result_set.proto\032#google/spanner" - + "/v1/transaction.proto\032\034google/spanner/v1" - + "/type.proto\"~\n\024CreateSessionRequest\0229\n\010d" - + "atabase\030\001 \001(\tB\'\340A\002\372A!\n\037spanner.googleapi" - + "s.com/Database\022+\n\007session\030\002 \001(\0132\032.google" - + ".spanner.v1.Session\"\251\001\n\032BatchCreateSessi" - + "onsRequest\0229\n\010database\030\001 \001(\tB\'\340A\002\372A!\n\037sp" - + "anner.googleapis.com/Database\0224\n\020session" - + "_template\030\002 \001(\0132\032.google.spanner.v1.Sess" - + "ion\022\032\n\rsession_count\030\003 \001(\005B\003\340A\002\"J\n\033Batch" - + "CreateSessionsResponse\022+\n\007session\030\001 \003(\0132" - + "\032.google.spanner.v1.Session\"\344\002\n\007Session\022" - + "\014\n\004name\030\001 \001(\t\0226\n\006labels\030\002 \003(\0132&.google.s" - + "panner.v1.Session.LabelsEntry\022/\n\013create_" - + "time\030\003 \001(\0132\032.google.protobuf.Timestamp\022=" - + "\n\031approximate_last_use_time\030\004 \001(\0132\032.goog" - + "le.protobuf.Timestamp\032-\n\013LabelsEntry\022\013\n\003" - + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001:t\352Aq\n\036spann" - + "er.googleapis.com/Session\022Oprojects/{pro" - + "ject}/instances/{instance}/databases/{da" - + "tabase}/sessions/{session}\"I\n\021GetSession" - + "Request\0224\n\004name\030\001 \001(\tB&\340A\002\372A \n\036spanner.g" - + "oogleapis.com/Session\"\207\001\n\023ListSessionsRe" - + "quest\0229\n\010database\030\001 \001(\tB\'\340A\002\372A!\n\037spanner" - + ".googleapis.com/Database\022\021\n\tpage_size\030\002 " - + "\001(\005\022\022\n\npage_token\030\003 \001(\t\022\016\n\006filter\030\004 \001(\t\"" - + "]\n\024ListSessionsResponse\022,\n\010sessions\030\001 \003(" - + "\0132\032.google.spanner.v1.Session\022\027\n\017next_pa" - + "ge_token\030\002 \001(\t\"L\n\024DeleteSessionRequest\0224" - + "\n\004name\030\001 \001(\tB&\340A\002\372A \n\036spanner.googleapis" - + ".com/Session\"\202\005\n\021ExecuteSqlRequest\0227\n\007se" - + "ssion\030\001 \001(\tB&\340A\002\372A \n\036spanner.googleapis." - + "com/Session\022;\n\013transaction\030\002 \001(\0132&.googl" - + "e.spanner.v1.TransactionSelector\022\020\n\003sql\030" - + "\003 \001(\tB\003\340A\002\022\'\n\006params\030\004 \001(\0132\027.google.prot" - + "obuf.Struct\022I\n\013param_types\030\005 \003(\01324.googl" - + "e.spanner.v1.ExecuteSqlRequest.ParamType" - + "sEntry\022\024\n\014resume_token\030\006 \001(\014\022B\n\nquery_mo" - + "de\030\007 \001(\0162..google.spanner.v1.ExecuteSqlR" - + "equest.QueryMode\022\027\n\017partition_token\030\010 \001(" - + "\014\022\r\n\005seqno\030\t \001(\003\022H\n\rquery_options\030\n \001(\0132" - + "1.google.spanner.v1.ExecuteSqlRequest.Qu" - + "eryOptions\032)\n\014QueryOptions\022\031\n\021optimizer_" - + "version\030\001 \001(\t\032J\n\017ParamTypesEntry\022\013\n\003key\030" - + "\001 \001(\t\022&\n\005value\030\002 \001(\0132\027.google.spanner.v1" - + ".Type:\0028\001\".\n\tQueryMode\022\n\n\006NORMAL\020\000\022\010\n\004PL" - + "AN\020\001\022\013\n\007PROFILE\020\002\"\337\003\n\026ExecuteBatchDmlReq" - + "uest\0227\n\007session\030\001 \001(\tB&\340A\002\372A \n\036spanner.g" - + "oogleapis.com/Session\022@\n\013transaction\030\002 \001" - + "(\0132&.google.spanner.v1.TransactionSelect" - + "orB\003\340A\002\022L\n\nstatements\030\003 \003(\01323.google.spa" - + "nner.v1.ExecuteBatchDmlRequest.Statement" - + "B\003\340A\002\022\022\n\005seqno\030\004 \001(\003B\003\340A\002\032\347\001\n\tStatement\022" - + "\013\n\003sql\030\001 \001(\t\022\'\n\006params\030\002 \001(\0132\027.google.pr" - + "otobuf.Struct\022X\n\013param_types\030\003 \003(\0132C.goo" - + "gle.spanner.v1.ExecuteBatchDmlRequest.St" - + "atement.ParamTypesEntry\032J\n\017ParamTypesEnt" - + "ry\022\013\n\003key\030\001 \001(\t\022&\n\005value\030\002 \001(\0132\027.google." - + "spanner.v1.Type:\0028\001\"p\n\027ExecuteBatchDmlRe" - + "sponse\0221\n\013result_sets\030\001 \003(\0132\034.google.spa" - + "nner.v1.ResultSet\022\"\n\006status\030\002 \001(\0132\022.goog" - + "le.rpc.Status\"H\n\020PartitionOptions\022\034\n\024par" - + "tition_size_bytes\030\001 \001(\003\022\026\n\016max_partition" - + "s\030\002 \001(\003\"\243\003\n\025PartitionQueryRequest\0227\n\007ses" - + "sion\030\001 \001(\tB&\340A\002\372A \n\036spanner.googleapis.c" - + "om/Session\022;\n\013transaction\030\002 \001(\0132&.google" - + ".spanner.v1.TransactionSelector\022\020\n\003sql\030\003" - + " \001(\tB\003\340A\002\022\'\n\006params\030\004 \001(\0132\027.google.proto" - + "buf.Struct\022M\n\013param_types\030\005 \003(\01328.google" - + ".spanner.v1.PartitionQueryRequest.ParamT" - + "ypesEntry\022>\n\021partition_options\030\006 \001(\0132#.g" - + "oogle.spanner.v1.PartitionOptions\032J\n\017Par" - + "amTypesEntry\022\013\n\003key\030\001 \001(\t\022&\n\005value\030\002 \001(\013" - + "2\027.google.spanner.v1.Type:\0028\001\"\261\002\n\024Partit" - + "ionReadRequest\0227\n\007session\030\001 \001(\tB&\340A\002\372A \n" - + "\036spanner.googleapis.com/Session\022;\n\013trans" - + "action\030\002 \001(\0132&.google.spanner.v1.Transac" - + "tionSelector\022\022\n\005table\030\003 \001(\tB\003\340A\002\022\r\n\005inde" - + "x\030\004 \001(\t\022\017\n\007columns\030\005 \003(\t\022/\n\007key_set\030\006 \001(" - + "\0132\031.google.spanner.v1.KeySetB\003\340A\002\022>\n\021par" - + "tition_options\030\t \001(\0132#.google.spanner.v1" - + ".PartitionOptions\"$\n\tPartition\022\027\n\017partit" - + "ion_token\030\001 \001(\014\"z\n\021PartitionResponse\0220\n\n" - + "partitions\030\001 \003(\0132\034.google.spanner.v1.Par" - + "tition\0223\n\013transaction\030\002 \001(\0132\036.google.spa" - + "nner.v1.Transaction\"\253\002\n\013ReadRequest\0227\n\007s" - + "ession\030\001 \001(\tB&\340A\002\372A \n\036spanner.googleapis" - + ".com/Session\022;\n\013transaction\030\002 \001(\0132&.goog" - + "le.spanner.v1.TransactionSelector\022\022\n\005tab" - + "le\030\003 \001(\tB\003\340A\002\022\r\n\005index\030\004 \001(\t\022\024\n\007columns\030" - + "\005 \003(\tB\003\340A\002\022/\n\007key_set\030\006 \001(\0132\031.google.spa" - + "nner.v1.KeySetB\003\340A\002\022\r\n\005limit\030\010 \001(\003\022\024\n\014re" - + "sume_token\030\t \001(\014\022\027\n\017partition_token\030\n \001(" - + "\014\"\217\001\n\027BeginTransactionRequest\0227\n\007session" - + "\030\001 \001(\tB&\340A\002\372A \n\036spanner.googleapis.com/S" - + "ession\022;\n\007options\030\002 \001(\0132%.google.spanner" - + ".v1.TransactionOptionsB\003\340A\002\"\352\001\n\rCommitRe" - + "quest\0227\n\007session\030\001 \001(\tB&\340A\002\372A \n\036spanner." - + "googleapis.com/Session\022\030\n\016transaction_id" - + "\030\002 \001(\014H\000\022G\n\026single_use_transaction\030\003 \001(\013" - + "2%.google.spanner.v1.TransactionOptionsH" - + "\000\022.\n\tmutations\030\004 \003(\0132\033.google.spanner.v1" - + ".MutationB\r\n\013transaction\"F\n\016CommitRespon" - + "se\0224\n\020commit_timestamp\030\001 \001(\0132\032.google.pr" - + "otobuf.Timestamp\"g\n\017RollbackRequest\0227\n\007s" - + "ession\030\001 \001(\tB&\340A\002\372A \n\036spanner.googleapis" - + ".com/Session\022\033\n\016transaction_id\030\002 \001(\014B\003\340A" - + "\0022\300\026\n\007Spanner\022\246\001\n\rCreateSession\022\'.google" - + ".spanner.v1.CreateSessionRequest\032\032.googl" - + "e.spanner.v1.Session\"P\202\323\344\223\002?\":/v1/{datab" - + "ase=projects/*/instances/*/databases/*}/" - + "sessions:\001*\332A\010database\022\340\001\n\023BatchCreateSe" - + "ssions\022-.google.spanner.v1.BatchCreateSe" - + "ssionsRequest\032..google.spanner.v1.BatchC" - + "reateSessionsResponse\"j\202\323\344\223\002K\"F/v1/{data" - + "base=projects/*/instances/*/databases/*}" - + "/sessions:batchCreate:\001*\332A\026database,sess" - + "ion_count\022\227\001\n\nGetSession\022$.google.spanne" - + "r.v1.GetSessionRequest\032\032.google.spanner." - + "v1.Session\"G\202\323\344\223\002:\0228/v1/{name=projects/*" - + "/instances/*/databases/*/sessions/*}\332A\004n" - + "ame\022\256\001\n\014ListSessions\022&.google.spanner.v1" - + ".ListSessionsRequest\032\'.google.spanner.v1" - + ".ListSessionsResponse\"M\202\323\344\223\002<\022:/v1/{data" - + "base=projects/*/instances/*/databases/*}" - + "/sessions\332A\010database\022\231\001\n\rDeleteSession\022\'" - + ".google.spanner.v1.DeleteSessionRequest\032" - + "\026.google.protobuf.Empty\"G\202\323\344\223\002:*8/v1/{na" - + "me=projects/*/instances/*/databases/*/se" - + "ssions/*}\332A\004name\022\243\001\n\nExecuteSql\022$.google" - + ".spanner.v1.ExecuteSqlRequest\032\034.google.s" - + "panner.v1.ResultSet\"Q\202\323\344\223\002K\"F/v1/{sessio" - + "n=projects/*/instances/*/databases/*/ses" - + "sions/*}:executeSql:\001*\022\276\001\n\023ExecuteStream" - + "ingSql\022$.google.spanner.v1.ExecuteSqlReq" - + "uest\032#.google.spanner.v1.PartialResultSe" - + "t\"Z\202\323\344\223\002T\"O/v1/{session=projects/*/insta" - + "nces/*/databases/*/sessions/*}:executeSt" - + "reamingSql:\001*0\001\022\300\001\n\017ExecuteBatchDml\022).go" - + "ogle.spanner.v1.ExecuteBatchDmlRequest\032*" - + ".google.spanner.v1.ExecuteBatchDmlRespon" - + "se\"V\202\323\344\223\002P\"K/v1/{session=projects/*/inst" - + "ances/*/databases/*/sessions/*}:executeB" - + "atchDml:\001*\022\221\001\n\004Read\022\036.google.spanner.v1." - + "ReadRequest\032\034.google.spanner.v1.ResultSe" - + "t\"K\202\323\344\223\002E\"@/v1/{session=projects/*/insta" - + "nces/*/databases/*/sessions/*}:read:\001*\022\254" - + "\001\n\rStreamingRead\022\036.google.spanner.v1.Rea" - + "dRequest\032#.google.spanner.v1.PartialResu" - + "ltSet\"T\202\323\344\223\002N\"I/v1/{session=projects/*/i" - + "nstances/*/databases/*/sessions/*}:strea" - + "mingRead:\001*0\001\022\311\001\n\020BeginTransaction\022*.goo" - + "gle.spanner.v1.BeginTransactionRequest\032\036" - + ".google.spanner.v1.Transaction\"i\202\323\344\223\002Q\"L" - + "/v1/{session=projects/*/instances/*/data" - + "bases/*/sessions/*}:beginTransaction:\001*\332" - + "A\017session,options\022\353\001\n\006Commit\022 .google.sp" - + "anner.v1.CommitRequest\032!.google.spanner." - + "v1.CommitResponse\"\233\001\202\323\344\223\002G\"B/v1/{session" + + "e.proto\032\036google/protobuf/duration.proto\032" + + "\033google/protobuf/empty.proto\032\034google/pro" + + "tobuf/struct.proto\032\037google/protobuf/time" + + "stamp.proto\032\027google/rpc/status.proto\032\034go" + + "ogle/spanner/v1/keys.proto\032 google/spann" + + "er/v1/mutation.proto\032\"google/spanner/v1/" + + "result_set.proto\032#google/spanner/v1/tran" + + "saction.proto\032\034google/spanner/v1/type.pr" + + "oto\"~\n\024CreateSessionRequest\0229\n\010database\030" + + "\001 \001(\tB\'\340A\002\372A!\n\037spanner.googleapis.com/Da" + + "tabase\022+\n\007session\030\002 \001(\0132\032.google.spanner" + + ".v1.Session\"\251\001\n\032BatchCreateSessionsReque" + + "st\0229\n\010database\030\001 \001(\tB\'\340A\002\372A!\n\037spanner.go" + + "ogleapis.com/Database\0224\n\020session_templat" + + "e\030\002 \001(\0132\032.google.spanner.v1.Session\022\032\n\rs" + + "ession_count\030\003 \001(\005B\003\340A\002\"J\n\033BatchCreateSe" + + "ssionsResponse\022+\n\007session\030\001 \003(\0132\032.google" + + ".spanner.v1.Session\"\344\002\n\007Session\022\014\n\004name\030" + + "\001 \001(\t\0226\n\006labels\030\002 \003(\0132&.google.spanner.v" + + "1.Session.LabelsEntry\022/\n\013create_time\030\003 \001" + + "(\0132\032.google.protobuf.Timestamp\022=\n\031approx" + + "imate_last_use_time\030\004 \001(\0132\032.google.proto" + + "buf.Timestamp\032-\n\013LabelsEntry\022\013\n\003key\030\001 \001(" + + "\t\022\r\n\005value\030\002 \001(\t:\0028\001:t\352Aq\n\036spanner.googl" + + "eapis.com/Session\022Oprojects/{project}/in" + + "stances/{instance}/databases/{database}/" + + "sessions/{session}\"I\n\021GetSessionRequest\022" + + "4\n\004name\030\001 \001(\tB&\340A\002\372A \n\036spanner.googleapi" + + "s.com/Session\"\207\001\n\023ListSessionsRequest\0229\n" + + "\010database\030\001 \001(\tB\'\340A\002\372A!\n\037spanner.googlea" + + "pis.com/Database\022\021\n\tpage_size\030\002 \001(\005\022\022\n\np" + + "age_token\030\003 \001(\t\022\016\n\006filter\030\004 \001(\t\"]\n\024ListS" + + "essionsResponse\022,\n\010sessions\030\001 \003(\0132\032.goog" + + "le.spanner.v1.Session\022\027\n\017next_page_token" + + "\030\002 \001(\t\"L\n\024DeleteSessionRequest\0224\n\004name\030\001" + + " \001(\tB&\340A\002\372A \n\036spanner.googleapis.com/Ses" + + "sion\"\202\005\n\021ExecuteSqlRequest\0227\n\007session\030\001 " + + "\001(\tB&\340A\002\372A \n\036spanner.googleapis.com/Sess" + + "ion\022;\n\013transaction\030\002 \001(\0132&.google.spanne" + + "r.v1.TransactionSelector\022\020\n\003sql\030\003 \001(\tB\003\340" + + "A\002\022\'\n\006params\030\004 \001(\0132\027.google.protobuf.Str" + + "uct\022I\n\013param_types\030\005 \003(\01324.google.spanne" + + "r.v1.ExecuteSqlRequest.ParamTypesEntry\022\024" + + "\n\014resume_token\030\006 \001(\014\022B\n\nquery_mode\030\007 \001(\016" + + "2..google.spanner.v1.ExecuteSqlRequest.Q" + + "ueryMode\022\027\n\017partition_token\030\010 \001(\014\022\r\n\005seq" + + "no\030\t \001(\003\022H\n\rquery_options\030\n \001(\01321.google" + + ".spanner.v1.ExecuteSqlRequest.QueryOptio" + + "ns\032)\n\014QueryOptions\022\031\n\021optimizer_version\030" + + "\001 \001(\t\032J\n\017ParamTypesEntry\022\013\n\003key\030\001 \001(\t\022&\n" + + "\005value\030\002 \001(\0132\027.google.spanner.v1.Type:\0028" + + "\001\".\n\tQueryMode\022\n\n\006NORMAL\020\000\022\010\n\004PLAN\020\001\022\013\n\007" + + "PROFILE\020\002\"\337\003\n\026ExecuteBatchDmlRequest\0227\n\007" + + "session\030\001 \001(\tB&\340A\002\372A \n\036spanner.googleapi" + + "s.com/Session\022@\n\013transaction\030\002 \001(\0132&.goo" + + "gle.spanner.v1.TransactionSelectorB\003\340A\002\022" + + "L\n\nstatements\030\003 \003(\01323.google.spanner.v1." + + "ExecuteBatchDmlRequest.StatementB\003\340A\002\022\022\n" + + "\005seqno\030\004 \001(\003B\003\340A\002\032\347\001\n\tStatement\022\013\n\003sql\030\001" + + " \001(\t\022\'\n\006params\030\002 \001(\0132\027.google.protobuf.S" + + "truct\022X\n\013param_types\030\003 \003(\0132C.google.span" + + "ner.v1.ExecuteBatchDmlRequest.Statement." + + "ParamTypesEntry\032J\n\017ParamTypesEntry\022\013\n\003ke" + + "y\030\001 \001(\t\022&\n\005value\030\002 \001(\0132\027.google.spanner." + + "v1.Type:\0028\001\"p\n\027ExecuteBatchDmlResponse\0221" + + "\n\013result_sets\030\001 \003(\0132\034.google.spanner.v1." + + "ResultSet\022\"\n\006status\030\002 \001(\0132\022.google.rpc.S" + + "tatus\"H\n\020PartitionOptions\022\034\n\024partition_s" + + "ize_bytes\030\001 \001(\003\022\026\n\016max_partitions\030\002 \001(\003\"" + + "\243\003\n\025PartitionQueryRequest\0227\n\007session\030\001 \001" + + "(\tB&\340A\002\372A \n\036spanner.googleapis.com/Sessi" + + "on\022;\n\013transaction\030\002 \001(\0132&.google.spanner" + + ".v1.TransactionSelector\022\020\n\003sql\030\003 \001(\tB\003\340A" + + "\002\022\'\n\006params\030\004 \001(\0132\027.google.protobuf.Stru" + + "ct\022M\n\013param_types\030\005 \003(\01328.google.spanner" + + ".v1.PartitionQueryRequest.ParamTypesEntr" + + "y\022>\n\021partition_options\030\006 \001(\0132#.google.sp" + + "anner.v1.PartitionOptions\032J\n\017ParamTypesE" + + "ntry\022\013\n\003key\030\001 \001(\t\022&\n\005value\030\002 \001(\0132\027.googl" + + "e.spanner.v1.Type:\0028\001\"\261\002\n\024PartitionReadR" + + "equest\0227\n\007session\030\001 \001(\tB&\340A\002\372A \n\036spanner" + + ".googleapis.com/Session\022;\n\013transaction\030\002" + + " \001(\0132&.google.spanner.v1.TransactionSele" + + "ctor\022\022\n\005table\030\003 \001(\tB\003\340A\002\022\r\n\005index\030\004 \001(\t\022" + + "\017\n\007columns\030\005 \003(\t\022/\n\007key_set\030\006 \001(\0132\031.goog" + + "le.spanner.v1.KeySetB\003\340A\002\022>\n\021partition_o" + + "ptions\030\t \001(\0132#.google.spanner.v1.Partiti" + + "onOptions\"$\n\tPartition\022\027\n\017partition_toke" + + "n\030\001 \001(\014\"z\n\021PartitionResponse\0220\n\npartitio" + + "ns\030\001 \003(\0132\034.google.spanner.v1.Partition\0223" + + "\n\013transaction\030\002 \001(\0132\036.google.spanner.v1." + + "Transaction\"\253\002\n\013ReadRequest\0227\n\007session\030\001" + + " \001(\tB&\340A\002\372A \n\036spanner.googleapis.com/Ses" + + "sion\022;\n\013transaction\030\002 \001(\0132&.google.spann" + + "er.v1.TransactionSelector\022\022\n\005table\030\003 \001(\t" + + "B\003\340A\002\022\r\n\005index\030\004 \001(\t\022\024\n\007columns\030\005 \003(\tB\003\340" + + "A\002\022/\n\007key_set\030\006 \001(\0132\031.google.spanner.v1." + + "KeySetB\003\340A\002\022\r\n\005limit\030\010 \001(\003\022\024\n\014resume_tok" + + "en\030\t \001(\014\022\027\n\017partition_token\030\n \001(\014\"\217\001\n\027Be" + + "ginTransactionRequest\0227\n\007session\030\001 \001(\tB&" + + "\340A\002\372A \n\036spanner.googleapis.com/Session\022;" + + "\n\007options\030\002 \001(\0132%.google.spanner.v1.Tran" + + "sactionOptionsB\003\340A\002\"\207\002\n\rCommitRequest\0227\n" + + "\007session\030\001 \001(\tB&\340A\002\372A \n\036spanner.googleap" + + "is.com/Session\022\030\n\016transaction_id\030\002 \001(\014H\000" + + "\022G\n\026single_use_transaction\030\003 \001(\0132%.googl" + + "e.spanner.v1.TransactionOptionsH\000\022.\n\tmut" + + "ations\030\004 \003(\0132\033.google.spanner.v1.Mutatio" + + "n\022\033\n\023return_commit_stats\030\005 \001(\010B\r\n\013transa" + + "ction\"\345\001\n\016CommitResponse\0224\n\020commit_times" + + "tamp\030\001 \001(\0132\032.google.protobuf.Timestamp\022C" + + "\n\014commit_stats\030\002 \001(\0132-.google.spanner.v1" + + ".CommitResponse.CommitStats\032X\n\013CommitSta" + + "ts\022\026\n\016mutation_count\030\001 \001(\003\0221\n\016overload_d" + + "elay\030\002 \001(\0132\031.google.protobuf.Duration\"g\n" + + "\017RollbackRequest\0227\n\007session\030\001 \001(\tB&\340A\002\372A" + + " \n\036spanner.googleapis.com/Session\022\033\n\016tra" + + "nsaction_id\030\002 \001(\014B\003\340A\0022\300\026\n\007Spanner\022\246\001\n\rC" + + "reateSession\022\'.google.spanner.v1.CreateS" + + "essionRequest\032\032.google.spanner.v1.Sessio" + + "n\"P\202\323\344\223\002?\":/v1/{database=projects/*/inst" + + "ances/*/databases/*}/sessions:\001*\332A\010datab" + + "ase\022\340\001\n\023BatchCreateSessions\022-.google.spa" + + "nner.v1.BatchCreateSessionsRequest\032..goo" + + "gle.spanner.v1.BatchCreateSessionsRespon" + + "se\"j\202\323\344\223\002K\"F/v1/{database=projects/*/ins" + + "tances/*/databases/*}/sessions:batchCrea" + + "te:\001*\332A\026database,session_count\022\227\001\n\nGetSe" + + "ssion\022$.google.spanner.v1.GetSessionRequ" + + "est\032\032.google.spanner.v1.Session\"G\202\323\344\223\002:\022" + + "8/v1/{name=projects/*/instances/*/databa" + + "ses/*/sessions/*}\332A\004name\022\256\001\n\014ListSession" + + "s\022&.google.spanner.v1.ListSessionsReques" + + "t\032\'.google.spanner.v1.ListSessionsRespon" + + "se\"M\202\323\344\223\002<\022:/v1/{database=projects/*/ins" + + "tances/*/databases/*}/sessions\332A\010databas" + + "e\022\231\001\n\rDeleteSession\022\'.google.spanner.v1." + + "DeleteSessionRequest\032\026.google.protobuf.E" + + "mpty\"G\202\323\344\223\002:*8/v1/{name=projects/*/insta" + + "nces/*/databases/*/sessions/*}\332A\004name\022\243\001" + + "\n\nExecuteSql\022$.google.spanner.v1.Execute" + + "SqlRequest\032\034.google.spanner.v1.ResultSet" + + "\"Q\202\323\344\223\002K\"F/v1/{session=projects/*/instan" + + "ces/*/databases/*/sessions/*}:executeSql" + + ":\001*\022\276\001\n\023ExecuteStreamingSql\022$.google.spa" + + "nner.v1.ExecuteSqlRequest\032#.google.spann" + + "er.v1.PartialResultSet\"Z\202\323\344\223\002T\"O/v1/{ses" + + "sion=projects/*/instances/*/databases/*/" + + "sessions/*}:executeStreamingSql:\001*0\001\022\300\001\n" + + "\017ExecuteBatchDml\022).google.spanner.v1.Exe" + + "cuteBatchDmlRequest\032*.google.spanner.v1." + + "ExecuteBatchDmlResponse\"V\202\323\344\223\002P\"K/v1/{se" + + "ssion=projects/*/instances/*/databases/*" + + "/sessions/*}:executeBatchDml:\001*\022\221\001\n\004Read" + + "\022\036.google.spanner.v1.ReadRequest\032\034.googl" + + "e.spanner.v1.ResultSet\"K\202\323\344\223\002E\"@/v1/{ses" + + "sion=projects/*/instances/*/databases/*/" + + "sessions/*}:read:\001*\022\254\001\n\rStreamingRead\022\036." + + "google.spanner.v1.ReadRequest\032#.google.s" + + "panner.v1.PartialResultSet\"T\202\323\344\223\002N\"I/v1/" + + "{session=projects/*/instances/*/database" + + "s/*/sessions/*}:streamingRead:\001*0\001\022\311\001\n\020B" + + "eginTransaction\022*.google.spanner.v1.Begi" + + "nTransactionRequest\032\036.google.spanner.v1." + + "Transaction\"i\202\323\344\223\002Q\"L/v1/{session=projec" + + "ts/*/instances/*/databases/*/sessions/*}" + + ":beginTransaction:\001*\332A\017session,options\022\353" + + "\001\n\006Commit\022 .google.spanner.v1.CommitRequ" + + "est\032!.google.spanner.v1.CommitResponse\"\233" + + "\001\202\323\344\223\002G\"B/v1/{session=projects/*/instanc" + + "es/*/databases/*/sessions/*}:commit:\001*\332A" + + " session,transaction_id,mutations\332A(sess" + + "ion,single_use_transaction,mutations\022\260\001\n" + + "\010Rollback\022\".google.spanner.v1.RollbackRe" + + "quest\032\026.google.protobuf.Empty\"h\202\323\344\223\002I\"D/" + + "v1/{session=projects/*/instances/*/datab" + + "ases/*/sessions/*}:rollback:\001*\332A\026session" + + ",transaction_id\022\267\001\n\016PartitionQuery\022(.goo" + + "gle.spanner.v1.PartitionQueryRequest\032$.g" + + "oogle.spanner.v1.PartitionResponse\"U\202\323\344\223" + + "\002O\"J/v1/{session=projects/*/instances/*/" + + "databases/*/sessions/*}:partitionQuery:\001" + + "*\022\264\001\n\rPartitionRead\022\'.google.spanner.v1." + + "PartitionReadRequest\032$.google.spanner.v1" + + ".PartitionResponse\"T\202\323\344\223\002N\"I/v1/{session" + "=projects/*/instances/*/databases/*/sess" - + "ions/*}:commit:\001*\332A session,transaction_" - + "id,mutations\332A(session,single_use_transa" - + "ction,mutations\022\260\001\n\010Rollback\022\".google.sp" - + "anner.v1.RollbackRequest\032\026.google.protob" - + "uf.Empty\"h\202\323\344\223\002I\"D/v1/{session=projects/" - + "*/instances/*/databases/*/sessions/*}:ro" - + "llback:\001*\332A\026session,transaction_id\022\267\001\n\016P" - + "artitionQuery\022(.google.spanner.v1.Partit" - + "ionQueryRequest\032$.google.spanner.v1.Part" - + "itionResponse\"U\202\323\344\223\002O\"J/v1/{session=proj" - + "ects/*/instances/*/databases/*/sessions/" - + "*}:partitionQuery:\001*\022\264\001\n\rPartitionRead\022\'" - + ".google.spanner.v1.PartitionReadRequest\032" - + "$.google.spanner.v1.PartitionResponse\"T\202" - + "\323\344\223\002N\"I/v1/{session=projects/*/instances" - + "/*/databases/*/sessions/*}:partitionRead" - + ":\001*\032w\312A\026spanner.googleapis.com\322A[https:/" - + "/www.googleapis.com/auth/cloud-platform," - + "https://www.googleapis.com/auth/spanner." - + "dataB\224\002\n\025com.google.spanner.v1B\014SpannerP" - + "rotoP\001Z8google.golang.org/genproto/googl" - + "eapis/spanner/v1;spanner\252\002\027Google.Cloud." - + "Spanner.V1\312\002\027Google\\Cloud\\Spanner\\V1\352\002\032G" - + "oogle::Cloud::Spanner::V1\352A_\n\037spanner.go" - + "ogleapis.com/Database\022 Date: Sat, 24 Oct 2020 13:47:42 +0200 Subject: [PATCH 02/33] fix: add clirr ignored differences --- .../clirr-ignored-differences.xml | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/google-cloud-spanner/clirr-ignored-differences.xml b/google-cloud-spanner/clirr-ignored-differences.xml index 55ff76adb72..4580d5378c1 100644 --- a/google-cloud-spanner/clirr-ignored-differences.xml +++ b/google-cloud-spanner/clirr-ignored-differences.xml @@ -428,5 +428,29 @@ com/google/cloud/spanner/TransactionRunner com.google.cloud.spanner.CommitResponse getCommitResponse() + + 7004 + com/google/cloud/spanner/DatabaseClient + com.google.cloud.spanner.TransactionRunner readWriteTransaction() + com.google.cloud.spanner.TransactionRunner readWriteTransaction(com.google.cloud.spanner.TransactionOption[]) + + + 7004 + com/google/cloud/spanner/DatabaseClient + com.google.cloud.spanner.TransactionManager transactionManager() + com.google.cloud.spanner.TransactionManager transactionManager(com.google.cloud.spanner.TransactionOption[]) + + + 7004 + com/google/cloud/spanner/DatabaseClient + com.google.cloud.spanner.AsyncRunner runAsync() + com.google.cloud.spanner.AsyncRunner runAsync(com.google.cloud.spanner.TransactionOption[]) + + + 7004 + com/google/cloud/spanner/DatabaseClient + com.google.cloud.spanner.AsyncTransactionManager transactionManagerAsync() + com.google.cloud.spanner.AsyncTransactionManager transactionManagerAsync(com.google.cloud.spanner.TransactionOption[]) + From 34fbda64201c9690b6a5b5619050c86cdb32d897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Sat, 31 Oct 2020 08:30:04 +0100 Subject: [PATCH 03/33] fix: error message should start with getCommitResponse Co-authored-by: skuruppu --- .../java/com/google/cloud/spanner/TransactionManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManagerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManagerImpl.java index f7cea28dd2b..6ffb02c5078 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManagerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManagerImpl.java @@ -123,7 +123,7 @@ public Timestamp getCommitTimestamp() { public CommitResponse getCommitResponse() { Preconditions.checkState( txnState == TransactionState.COMMITTED, - "getCommitTimestamp can only be invoked if the transaction committed successfully"); + "getCommitResponse can only be invoked if the transaction committed successfully"); return txn.getCommitResponse(); } From 47b57ea6427a00c5826af6797607b3b06fba58e7 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Fri, 6 Nov 2020 20:32:56 +0100 Subject: [PATCH 04/33] feat: add CommitStats to Connection API --- google-cloud-spanner/pom.xml | 33 + .../google/cloud/spanner/CommitResponse.java | 5 + .../cloud/spanner/connection/Connection.java | 21 + .../spanner/connection/ConnectionImpl.java | 29 + .../ConnectionStatementExecutor.java | 6 + .../ConnectionStatementExecutorImpl.java | 46 + .../cloud/spanner/connection/DdlBatch.java | 12 + .../cloud/spanner/connection/DmlBatch.java | 12 + .../connection/ReadOnlyTransaction.java | 13 + .../connection/ReadWriteTransaction.java | 44 +- .../connection/SingleUseTransaction.java | 51 +- .../spanner/connection/StatementResult.java | 3 + .../cloud/spanner/connection/UnitOfWork.java | 13 + .../connection/ClientSideStatements.json | 31 + .../AbstractConnectionImplTest.java | 2 +- .../connection/ClientSideStatementsTest.java | 2 +- .../connection/it/ITCommitResponseTest.java | 149 + .../connection/ClientSideStatementsTest.sql | 9101 ++++++++++------- .../ConnectionImplGeneratedSqlScriptTest.sql | 1392 ++- 19 files changed, 7212 insertions(+), 3753 deletions(-) create mode 100644 google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 67ebc09c456..991ea83666c 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -377,5 +377,38 @@ + + + generate-test-sql-scripts + + + + org.codehaus.mojo + exec-maven-plugin + + + generateTestScripts + compile + + java + + + com.google.cloud.spanner.connection.SqlTestScriptsGenerator + + + do_log_statements + true + + + test + false + + + + + + + diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java index 80bfc42e9e8..e2a24b02691 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java @@ -34,6 +34,11 @@ public Timestamp getCommitTimestamp() { return Timestamp.fromProto(proto.getCommitTimestamp()); } + /** @return true if the {@link CommitResponse} includes {@link CommitStats}. */ + public boolean hasCommitStats() { + return proto.hasCommitStats(); + } + /** * Commit statistics are returned by a read/write transaction if specifically requested by passing * in {@link Options#commitStats()} to the transaction. 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 71b03e2e0b7..196b66024fd 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 @@ -22,6 +22,7 @@ import com.google.cloud.spanner.AbortedDueToConcurrentModificationException; import com.google.cloud.spanner.AbortedException; import com.google.cloud.spanner.AsyncResultSet; +import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.Mutation; import com.google.cloud.spanner.Options.QueryOption; @@ -438,6 +439,15 @@ public interface Connection extends AutoCloseable { */ String getOptimizerVersion(); + /** + * Sets whether this connection should request commit statistics from Cloud Spanner for read/write + * transactions and DML statements in autocommit mode. + */ + void setReturnCommitStats(boolean returnCommitStats); + + /** @return true if this connection requests commit statistics from Cloud Spanner. */ + boolean isReturnCommitStats(); + /** * Commits the current transaction of this connection. All mutations that have been buffered * during the current transaction will be written to the database. @@ -632,6 +642,17 @@ public interface Connection extends AutoCloseable { */ Timestamp getCommitTimestamp(); + /** + * @return the {@link CommitResponse} of the last {@link TransactionMode#READ_WRITE_TRANSACTION} + * transaction. This method will throw a {@link SpannerException} if there is no last {@link + * TransactionMode#READ_WRITE_TRANSACTION} transaction (i.e. the last transaction was a {@link + * TransactionMode#READ_ONLY_TRANSACTION}), or if the last {@link + * TransactionMode#READ_WRITE_TRANSACTION} transaction rolled back. It will also throw a + * {@link SpannerException} if the last {@link TransactionMode#READ_WRITE_TRANSACTION} + * transaction was empty when committed. + */ + CommitResponse getCommitResponse(); + /** * Starts a new DDL batch on this connection. A DDL batch allows several DDL statements to be * grouped into a batch that can be executed as a group. DDL statements that are issued during the 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 b49adbf1245..569210c3ab6 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 @@ -22,6 +22,7 @@ import com.google.api.core.ApiFutures; import com.google.cloud.Timestamp; import com.google.cloud.spanner.AsyncResultSet; +import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.Mutation; @@ -179,6 +180,7 @@ static UnitOfWorkType of(TransactionMode transactionMode) { private DatabaseClient dbClient; private boolean autocommit; private boolean readOnly; + private boolean returnCommitStats; private UnitOfWork currentUnitOfWork = null; /** @@ -574,6 +576,31 @@ Timestamp getCommitTimestampOrNull() { : this.currentUnitOfWork.getCommitTimestampOrNull(); } + @Override + public CommitResponse getCommitResponse() { + ConnectionPreconditions.checkState(!isClosed(), CLOSED_ERROR_MSG); + ConnectionPreconditions.checkState( + this.currentUnitOfWork != null, "There is no transaction on this connection"); + return this.currentUnitOfWork.getCommitResponse(); + } + + CommitResponse getCommitResponseOrNull() { + ConnectionPreconditions.checkState(!isClosed(), CLOSED_ERROR_MSG); + return this.currentUnitOfWork == null ? null : this.currentUnitOfWork.getCommitResponseOrNull(); + } + + @Override + public void setReturnCommitStats(boolean returnCommitStats) { + ConnectionPreconditions.checkState(!isClosed(), CLOSED_ERROR_MSG); + this.returnCommitStats = returnCommitStats; + } + + @Override + public boolean isReturnCommitStats() { + ConnectionPreconditions.checkState(!isClosed(), CLOSED_ERROR_MSG); + return this.returnCommitStats; + } + /** Resets this connection to its default transaction options. */ private void setDefaultTransactionOptions() { if (transactionStack.isEmpty()) { @@ -948,6 +975,7 @@ private UnitOfWork createNewUnitOfWork() { .setReadOnly(isReadOnly()) .setReadOnlyStaleness(readOnlyStaleness) .setAutocommitDmlMode(autocommitDmlMode) + .setReturnCommitStats(returnCommitStats) .setStatementTimeout(statementTimeout) .withStatementExecutor(statementExecutor) .build(); @@ -964,6 +992,7 @@ private UnitOfWork createNewUnitOfWork() { return ReadWriteTransaction.newBuilder() .setDatabaseClient(dbClient) .setRetryAbortsInternally(retryAbortsInternally) + .setReturnCommitStats(returnCommitStats) .setTransactionRetryListeners(transactionRetryListeners) .setStatementTimeout(statementTimeout) .withStatementExecutor(statementExecutor) 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 6c3ece56f75..5cbbdfb7c49 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 @@ -56,6 +56,8 @@ interface ConnectionStatementExecutor { StatementResult statementShowCommitTimestamp(); + StatementResult statementShowCommitResponse(); + StatementResult statementSetReadOnlyStaleness(TimestampBound staleness); StatementResult statementShowReadOnlyStaleness(); @@ -64,6 +66,10 @@ interface ConnectionStatementExecutor { StatementResult statementShowOptimizerVersion(); + StatementResult statementSetReturnCommitStats(Boolean returnCommitStats); + + StatementResult statementShowReturnCommitStats(); + StatementResult statementBeginTransaction(); StatementResult statementCommit(); 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 27b975b21e5..d51f6211c80 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 @@ -27,26 +27,37 @@ import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SET_READONLY; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SET_READ_ONLY_STALENESS; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SET_RETRY_ABORTS_INTERNALLY; +import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SET_RETURN_COMMIT_STATS; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SET_STATEMENT_TIMEOUT; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SET_TRANSACTION_MODE; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SHOW_AUTOCOMMIT; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SHOW_AUTOCOMMIT_DML_MODE; +import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SHOW_COMMIT_RESPONSE; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SHOW_COMMIT_TIMESTAMP; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SHOW_OPTIMIZER_VERSION; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SHOW_READONLY; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SHOW_READ_ONLY_STALENESS; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SHOW_READ_TIMESTAMP; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SHOW_RETRY_ABORTS_INTERNALLY; +import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SHOW_RETURN_COMMIT_STATS; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.SHOW_STATEMENT_TIMEOUT; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.START_BATCH_DDL; import static com.google.cloud.spanner.connection.StatementResult.ClientSideStatementType.START_BATCH_DML; import static com.google.cloud.spanner.connection.StatementResultImpl.noResult; import static com.google.cloud.spanner.connection.StatementResultImpl.resultSet; +import com.google.cloud.spanner.CommitResponse; +import com.google.cloud.spanner.CommitStats; +import com.google.cloud.spanner.ResultSet; +import com.google.cloud.spanner.ResultSets; +import com.google.cloud.spanner.Struct; import com.google.cloud.spanner.TimestampBound; +import com.google.cloud.spanner.Type; +import com.google.cloud.spanner.Type.StructField; import com.google.cloud.spanner.connection.ReadOnlyStalenessUtil.DurationValueGetter; import com.google.common.base.Preconditions; import com.google.protobuf.Duration; +import java.util.Arrays; import java.util.concurrent.TimeUnit; /** @@ -170,6 +181,29 @@ public StatementResult statementShowCommitTimestamp() { "COMMIT_TIMESTAMP", getConnection().getCommitTimestampOrNull(), SHOW_COMMIT_TIMESTAMP); } + @Override + public StatementResult statementShowCommitResponse() { + CommitResponse response = getConnection().getCommitResponseOrNull(); + CommitStats stats = + response == null || !response.hasCommitStats() ? null : response.getCommitStats(); + ResultSet rs = + ResultSets.forRows( + Type.struct( + StructField.of("COMMIT_TIMESTAMP", Type.timestamp()), + StructField.of("MUTATION_COUNT", Type.int64()), + StructField.of("OVERLOAD_DELAY", Type.string())), + Arrays.asList( + Struct.newBuilder() + .set("COMMIT_TIMESTAMP") + .to(response == null ? null : response.getCommitTimestamp()) + .set("MUTATION_COUNT") + .to(stats == null ? null : stats.getMutationCount()) + .set("OVERLOAD_DELAY") + .to(stats == null ? null : stats.getOverloadDelay().toString()) + .build())); + return StatementResultImpl.of(rs, SHOW_COMMIT_RESPONSE); + } + @Override public StatementResult statementSetReadOnlyStaleness(TimestampBound staleness) { getConnection().setReadOnlyStaleness(staleness); @@ -197,6 +231,18 @@ public StatementResult statementShowOptimizerVersion() { "OPTIMIZER_VERSION", getConnection().getOptimizerVersion(), SHOW_OPTIMIZER_VERSION); } + @Override + public StatementResult statementSetReturnCommitStats(Boolean returnCommitStats) { + getConnection().setReturnCommitStats(returnCommitStats); + return noResult(SET_RETURN_COMMIT_STATS); + } + + @Override + public StatementResult statementShowReturnCommitStats() { + return resultSet( + "RETURN_COMMIT_STATS", getConnection().isReturnCommitStats(), SHOW_RETURN_COMMIT_STATS); + } + @Override public StatementResult statementBeginTransaction() { getConnection().beginTransaction(); 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 7d4f18c4dbc..8227ee57ddc 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 @@ -20,6 +20,7 @@ import com.google.api.core.ApiFutures; import com.google.api.gax.longrunning.OperationFuture; import com.google.cloud.Timestamp; +import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.Mutation; @@ -168,6 +169,17 @@ public Timestamp getCommitTimestampOrNull() { return null; } + @Override + public CommitResponse getCommitResponse() { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.FAILED_PRECONDITION, "There is no commit response available for DDL batches."); + } + + @Override + public CommitResponse getCommitResponseOrNull() { + return null; + } + @Override public ApiFuture executeDdlAsync(ParsedStatement ddl) { ConnectionPreconditions.checkState( 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 b5b80e46cf9..3da5c6edd79 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 @@ -21,6 +21,7 @@ import com.google.api.core.ApiFutures; import com.google.api.core.SettableApiFuture; import com.google.cloud.Timestamp; +import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.Mutation; import com.google.cloud.spanner.Options.QueryOption; @@ -119,6 +120,17 @@ public Timestamp getCommitTimestampOrNull() { return null; } + @Override + public CommitResponse getCommitResponse() { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.FAILED_PRECONDITION, "There is no commit response available for DML batches."); + } + + @Override + public CommitResponse getCommitResponseOrNull() { + return null; + } + @Override public ApiFuture executeDdlAsync(ParsedStatement ddl) { throw SpannerExceptionFactory.newSpannerException( 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 09f3efc6d59..58739877730 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 @@ -19,6 +19,7 @@ import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutures; import com.google.cloud.Timestamp; +import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.Mutation; @@ -136,6 +137,18 @@ public Timestamp getCommitTimestampOrNull() { return null; } + @Override + public CommitResponse getCommitResponse() { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.FAILED_PRECONDITION, + "There is no commit response available for read-only transactions."); + } + + @Override + public CommitResponse getCommitResponseOrNull() { + return null; + } + @Override public ApiFuture executeDdlAsync(ParsedStatement ddl) { throw SpannerExceptionFactory.newSpannerException( 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 0a8e322e796..199e3f74198 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 @@ -26,9 +26,11 @@ import com.google.cloud.Timestamp; import com.google.cloud.spanner.AbortedDueToConcurrentModificationException; import com.google.cloud.spanner.AbortedException; +import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.Mutation; +import com.google.cloud.spanner.Options; import com.google.cloud.spanner.Options.QueryOption; import com.google.cloud.spanner.ResultSet; import com.google.cloud.spanner.SpannerException; @@ -75,7 +77,7 @@ class ReadWriteTransaction extends AbstractMultiUseTransaction { private int successfulRetries; private final List transactionRetryListeners; private volatile ApiFuture txContextFuture; - private volatile SettableApiFuture commitTimestampFuture; + private volatile SettableApiFuture commitResponseFuture; private volatile UnitOfWorkState state = UnitOfWorkState.STARTED; private volatile AbortedException abortedException; private boolean timedOutOrCancelled = false; @@ -87,6 +89,7 @@ class ReadWriteTransaction extends AbstractMultiUseTransaction { static class Builder extends AbstractMultiUseTransaction.Builder { private DatabaseClient dbClient; private Boolean retryAbortsInternally; + private boolean returnCommitStats; private List transactionRetryListeners; private Builder() {} @@ -102,6 +105,11 @@ Builder setRetryAbortsInternally(boolean retryAbortsInternally) { return this; } + Builder setReturnCommitStats(boolean returnCommitStats) { + this.returnCommitStats = returnCommitStats; + return this; + } + Builder setTransactionRetryListeners(List listeners) { Preconditions.checkNotNull(listeners); this.transactionRetryListeners = listeners; @@ -129,7 +137,10 @@ private ReadWriteTransaction(Builder builder) { this.dbClient = builder.dbClient; this.retryAbortsInternally = builder.retryAbortsInternally; this.transactionRetryListeners = builder.transactionRetryListeners; - this.txManager = dbClient.transactionManager(); + this.txManager = + builder.returnCommitStats + ? dbClient.transactionManager(Options.commitStats()) + : dbClient.transactionManager(); } @Override @@ -254,19 +265,30 @@ public Timestamp getReadTimestampOrNull() { return null; } - private boolean hasCommitTimestamp() { - return commitTimestampFuture != null; + private boolean hasCommitResponse() { + return commitResponseFuture != null; } @Override public Timestamp getCommitTimestamp() { - ConnectionPreconditions.checkState(hasCommitTimestamp(), "This transaction has not committed."); - return get(commitTimestampFuture); + ConnectionPreconditions.checkState(hasCommitResponse(), "This transaction has not committed."); + return get(commitResponseFuture).getCommitTimestamp(); } @Override public Timestamp getCommitTimestampOrNull() { - return hasCommitTimestamp() ? get(commitTimestampFuture) : null; + return hasCommitResponse() ? get(commitResponseFuture).getCommitTimestamp() : null; + } + + @Override + public CommitResponse getCommitResponse() { + ConnectionPreconditions.checkState(hasCommitResponse(), "This transaction has not committed."); + return get(commitResponseFuture); + } + + @Override + public CommitResponse getCommitResponseOrNull() { + return hasCommitResponse() ? get(commitResponseFuture) : null; } @Override @@ -540,7 +562,7 @@ public Void call() throws Exception { checkAborted(); get(txContextFuture).buffer(mutations); txManager.commit(); - commitTimestampFuture.set(txManager.getCommitTimestamp()); + commitResponseFuture.set(txManager.getCommitResponse()); state = UnitOfWorkState.COMMITTED; return null; } @@ -550,7 +572,7 @@ public Void call() throws Exception { public ApiFuture commitAsync() { checkValidTransaction(); state = UnitOfWorkState.COMMITTING; - commitTimestampFuture = SettableApiFuture.create(); + commitResponseFuture = SettableApiFuture.create(); ApiFuture res; if (retryAbortsInternally) { res = @@ -573,7 +595,7 @@ public Void call() throws Exception { } }); } catch (Throwable t) { - commitTimestampFuture.setException(t); + commitResponseFuture.setException(t); state = UnitOfWorkState.COMMIT_FAILED; try { txManager.close(); @@ -596,7 +618,7 @@ public Void call() throws Exception { try { return commitCallable.call(); } catch (Throwable t) { - commitTimestampFuture.setException(t); + commitResponseFuture.setException(t); state = UnitOfWorkState.COMMIT_FAILED; try { txManager.close(); 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 52011eb9100..de5b504302b 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,9 +20,11 @@ import com.google.api.core.SettableApiFuture; import com.google.api.gax.longrunning.OperationFuture; import com.google.cloud.Timestamp; +import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.Mutation; +import com.google.cloud.spanner.Options; import com.google.cloud.spanner.Options.QueryOption; import com.google.cloud.spanner.ReadOnlyTransaction; import com.google.cloud.spanner.ResultSet; @@ -70,6 +72,7 @@ class SingleUseTransaction extends AbstractBaseUnitOfWork { private final DatabaseClient dbClient; private final TimestampBound readOnlyStaleness; private final AutocommitDmlMode autocommitDmlMode; + private final boolean returnCommitStats; private volatile SettableApiFuture readTimestamp = null; private volatile TransactionManager txManager; private volatile TransactionRunner writeTransaction; @@ -82,6 +85,7 @@ static class Builder extends AbstractBaseUnitOfWork.Builder executeDdlAsync(final ParsedStatement ddl) { Preconditions.checkNotNull(ddl); @@ -329,13 +362,19 @@ public ApiFuture executeBatchUpdateAsync(Iterable updat } } + private TransactionRunner createWriteTransaction() { + return returnCommitStats + ? dbClient.readWriteTransaction(Options.commitStats()) + : dbClient.readWriteTransaction(); + } + private ApiFuture executeTransactionalUpdateAsync(final ParsedStatement update) { Callable callable = new Callable() { @Override public Long call() throws Exception { try { - writeTransaction = dbClient.readWriteTransaction(); + writeTransaction = createWriteTransaction(); Long res = writeTransaction.run( new TransactionCallable() { @@ -383,7 +422,7 @@ private ApiFuture executeTransactionalBatchUpdateAsync( new Callable() { @Override public long[] call() throws Exception { - writeTransaction = dbClient.readWriteTransaction(); + writeTransaction = createWriteTransaction(); return writeTransaction.run( new TransactionCallable() { @Override @@ -433,7 +472,7 @@ public ApiFuture writeAsync(final Iterable mutations) { @Override public Void call() throws Exception { try { - writeTransaction = dbClient.readWriteTransaction(); + writeTransaction = createWriteTransaction(); Void res = writeTransaction.run( new TransactionCallable() { 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 ada7ff03b5b..364ac5307ad 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 @@ -60,10 +60,13 @@ enum ClientSideStatementType { SET_STATEMENT_TIMEOUT, SHOW_READ_TIMESTAMP, SHOW_COMMIT_TIMESTAMP, + SHOW_COMMIT_RESPONSE, SHOW_READ_ONLY_STALENESS, SET_READ_ONLY_STALENESS, SHOW_OPTIMIZER_VERSION, SET_OPTIMIZER_VERSION, + SHOW_RETURN_COMMIT_STATS, + SET_RETURN_COMMIT_STATS, BEGIN, COMMIT, ROLLBACK, 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 eb3c47d4bf1..7255f7595cc 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 @@ -19,6 +19,7 @@ import com.google.api.core.ApiFuture; import com.google.api.core.InternalApi; import com.google.cloud.Timestamp; +import com.google.cloud.spanner.CommitResponse; import com.google.cloud.spanner.Mutation; import com.google.cloud.spanner.Options.QueryOption; import com.google.cloud.spanner.ReadContext; @@ -142,6 +143,18 @@ ApiFuture executeQueryAsync( /** @return the commit timestamp of this transaction or null if there is no commit timestamp. */ Timestamp getCommitTimestampOrNull(); + /** + * @return the {@link CommitResponse} of this transaction. Will throw a {@link SpannerException} + * if there is no {@link CommitResponse}. + */ + CommitResponse getCommitResponse(); + + /** + * @return the {@link CommitResponse} of this transaction or null if there is no {@link + * CommitResponse}. + */ + CommitResponse getCommitResponseOrNull(); + /** * Executes the specified DDL statements in this unit of work. For DDL batches, this will mean * that the statements are buffered locally and will be sent to Spanner when {@link diff --git a/google-cloud-spanner/src/main/resources/com/google/cloud/spanner/connection/ClientSideStatements.json b/google-cloud-spanner/src/main/resources/com/google/cloud/spanner/connection/ClientSideStatements.json index 8d8cca207dc..6761374ea57 100644 --- a/google-cloud-spanner/src/main/resources/com/google/cloud/spanner/connection/ClientSideStatements.json +++ b/google-cloud-spanner/src/main/resources/com/google/cloud/spanner/connection/ClientSideStatements.json @@ -76,6 +76,23 @@ "method": "statementShowOptimizerVersion", "exampleStatements": ["show variable optimizer_version"] }, + { + "name": "SHOW VARIABLE RETURN_COMMIT_STATS", + "executorName": "ClientSideStatementNoParamExecutor", + "resultType": "RESULT_SET", + "regex": "(?is)\\A\\s*show\\s+variable\\s+return_commit_stats\\s*\\z", + "method": "statementShowReturnCommitStats", + "exampleStatements": ["show variable return_commit_stats"] + }, + { + "name": "SHOW VARIABLE COMMIT_RESPONSE", + "executorName": "ClientSideStatementNoParamExecutor", + "resultType": "RESULT_SET", + "regex": "(?is)\\A\\s*show\\s+variable\\s+commit_response\\s*\\z", + "method": "statementShowCommitResponse", + "exampleStatements": ["show variable commit_response"], + "examplePrerequisiteStatements": ["update foo set bar=1"] + }, { "name": "BEGIN TRANSACTION", "executorName": "ClientSideStatementNoParamExecutor", @@ -263,6 +280,20 @@ "allowedValues": "'((\\d{1,20})|(LATEST)|())'", "converterName": "ClientSideStatementValueConverters$StringValueConverter" } + }, + { + "name": "SET RETURN_COMMIT_STATS = TRUE|FALSE", + "executorName": "ClientSideStatementSetExecutor", + "resultType": "NO_RESULT", + "regex": "(?is)\\A\\s*set\\s+return_commit_stats\\s*(?:=)\\s*(.*)\\z", + "method": "statementSetReturnCommitStats", + "exampleStatements": ["set return_commit_stats = true", "set return_commit_stats = false"], + "setStatement": { + "propertyName": "RETURN_COMMIT_STATS", + "separator": "=", + "allowedValues": "(TRUE|FALSE)", + "converterName": "ClientSideStatementValueConverters$BooleanConverter" + } } ] } \ No newline at end of file diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/AbstractConnectionImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/AbstractConnectionImplTest.java index 7d723512fd9..045bd006caf 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/AbstractConnectionImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/AbstractConnectionImplTest.java @@ -72,7 +72,7 @@ static interface ConnectionConsumer { * subclasses of {@link AbstractConnectionImplTest}. */ private static final String LOG_FILE = - "src/test/resources/com/google/cloud/spanner/jdbc/ConnectionImplGeneratedSqlScriptTest.sql"; + "src/test/resources/com/google/cloud/spanner/connection/ConnectionImplGeneratedSqlScriptTest.sql"; private static final String DO_LOG_PROPERTY = "do_log_statements"; private static boolean doLog; diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ClientSideStatementsTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ClientSideStatementsTest.java index 8f3eb612061..11be434f6e0 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ClientSideStatementsTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ClientSideStatementsTest.java @@ -52,7 +52,7 @@ public void testExecuteClientSideStatementsScript() throws Exception { } private static final String SCRIPT_FILE = - "src/test/resources/com/google/cloud/spanner/jdbc/ClientSideStatementsTest.sql"; + "src/test/resources/com/google/cloud/spanner/connection/ClientSideStatementsTest.sql"; private static PrintWriter writer; /** Generates the test script file */ diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java new file mode 100644 index 00000000000..51518652617 --- /dev/null +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java @@ -0,0 +1,149 @@ +/* + * Copyright 2020 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.common.truth.Truth.assertThat; + +import com.google.cloud.spanner.KeySet; +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.ITAbstractSpannerTest; +import org.junit.Before; +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 ITCommitResponseTest extends ITAbstractSpannerTest { + @Override + public void appendConnectionUri(StringBuilder uri) { + uri.append(";autocommit=false"); + } + + @Override + public boolean doCreateDefaultTestTable() { + return true; + } + + @Before + public void clearTestData() { + try (ITConnection connection = createConnection()) { + connection.bufferedWrite(Mutation.delete("TEST", KeySet.all())); + connection.commit(); + } + } + + @Test + public void testDefaultNoCommitStats() { + try (ITConnection connection = createConnection()) { + connection.bufferedWrite( + Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST").build()); + connection.commit(); + assertThat(connection.getCommitResponse()).isNotNull(); + assertThat(connection.getCommitResponse().getCommitTimestamp()).isNotNull(); + assertThat(connection.getCommitResponse().hasCommitStats()).isFalse(); + } + } + + @Test + public void testReturnCommitStats() { + try (ITConnection connection = createConnection()) { + connection.setReturnCommitStats(true); + connection.bufferedWrite( + Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST").build()); + connection.commit(); + assertThat(connection.getCommitResponse()).isNotNull(); + assertThat(connection.getCommitResponse().getCommitTimestamp()).isNotNull(); + assertThat(connection.getCommitResponse().hasCommitStats()).isTrue(); + assertThat(connection.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); + } + } + + @Test + public void testReturnCommitStatsUsingSql() { + try (ITConnection connection = createConnection()) { + connection.execute(Statement.of("SET RETURN_COMMIT_STATS=TRUE")); + connection.bufferedWrite( + Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST").build()); + connection.commit(); + assertThat(connection.getCommitResponse()).isNotNull(); + assertThat(connection.getCommitResponse().getCommitTimestamp()).isNotNull(); + assertThat(connection.getCommitResponse().hasCommitStats()).isTrue(); + assertThat(connection.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); + try (ResultSet rs = + connection.execute(Statement.of("SHOW VARIABLE COMMIT_RESPONSE")).getResultSet()) { + assertThat(rs.next()).isTrue(); + assertThat(rs.getTimestamp("COMMIT_TIMESTAMP")).isNotNull(); + assertThat(rs.getLong("MUTATION_COUNT")).isEqualTo(2L); + assertThat(rs.getString("OVERLOAD_DELAY")).isNotNull(); + assertThat(rs.next()).isFalse(); + } + } + } + + @Test + public void testAutocommitDefaultNoCommitStats() { + try (ITConnection connection = createConnection()) { + connection.setAutocommit(true); + connection.write( + Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST").build()); + assertThat(connection.getCommitResponse()).isNotNull(); + assertThat(connection.getCommitResponse().getCommitTimestamp()).isNotNull(); + assertThat(connection.getCommitResponse().hasCommitStats()).isFalse(); + } + } + + @Test + public void testAutocommitReturnCommitStats() { + try (ITConnection connection = createConnection()) { + connection.setAutocommit(true); + connection.setReturnCommitStats(true); + connection.write( + Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST").build()); + assertThat(connection.getCommitResponse()).isNotNull(); + assertThat(connection.getCommitResponse().getCommitTimestamp()).isNotNull(); + assertThat(connection.getCommitResponse().hasCommitStats()).isTrue(); + assertThat(connection.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); + } + } + + @Test + public void testAutocommitReturnCommitStatsUsingSql() { + try (ITConnection connection = createConnection()) { + connection.execute(Statement.of("SET AUTOCOMMIT=TRUE")); + connection.execute(Statement.of("SET RETURN_COMMIT_STATS=TRUE")); + connection.write( + Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST").build()); + assertThat(connection.getCommitResponse()).isNotNull(); + assertThat(connection.getCommitResponse().getCommitTimestamp()).isNotNull(); + assertThat(connection.getCommitResponse().hasCommitStats()).isTrue(); + assertThat(connection.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); + try (ResultSet rs = + connection.execute(Statement.of("SHOW VARIABLE COMMIT_RESPONSE")).getResultSet()) { + assertThat(rs.next()).isTrue(); + assertThat(rs.getTimestamp("COMMIT_TIMESTAMP")).isNotNull(); + assertThat(rs.getLong("MUTATION_COUNT")).isEqualTo(2L); + assertThat(rs.getString("OVERLOAD_DELAY")).isNotNull(); + assertThat(rs.next()).isFalse(); + } + } + } +} diff --git a/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/ClientSideStatementsTest.sql b/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/ClientSideStatementsTest.sql index fe8afd86e97..3d2522f21e8 100644 --- a/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/ClientSideStatementsTest.sql +++ b/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/connection/ClientSideStatementsTest.sql @@ -1931,9148 +1931,11005 @@ NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT show variable/-read_only_staleness; NEW_CONNECTION; -begin; +show variable optimizer_version; NEW_CONNECTION; -BEGIN; +SHOW VARIABLE OPTIMIZER_VERSION; NEW_CONNECTION; -begin; +show variable optimizer_version; NEW_CONNECTION; - begin; + show variable optimizer_version; NEW_CONNECTION; - begin; + show variable optimizer_version; NEW_CONNECTION; -begin; +show variable optimizer_version; NEW_CONNECTION; -begin ; +show variable optimizer_version ; NEW_CONNECTION; -begin ; +show variable optimizer_version ; NEW_CONNECTION; -begin +show variable optimizer_version ; NEW_CONNECTION; -begin; +show variable optimizer_version; NEW_CONNECTION; -begin; +show variable optimizer_version; NEW_CONNECTION; -begin; +show +variable +optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo begin; +foo show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin bar; +show variable optimizer_version bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%begin; +%show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin%; +show variable optimizer_version%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin%; +show variable%optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_begin; +_show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin_; +show variable optimizer_version_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin_; +show variable_optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&begin; +&show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin&; +show variable optimizer_version&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin&; +show variable&optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$begin; +$show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin$; +show variable optimizer_version$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin$; +show variable$optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@begin; +@show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin@; +show variable optimizer_version@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin@; +show variable@optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!begin; +!show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin!; +show variable optimizer_version!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin!; +show variable!optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*begin; +*show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin*; +show variable optimizer_version*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin*; +show variable*optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(begin; +(show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin(; +show variable optimizer_version(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin(; +show variable(optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)begin; +)show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin); +show variable optimizer_version); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin); +show variable)optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --begin; +-show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin-; +show variable optimizer_version-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin-; +show variable-optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+begin; ++show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin+; +show variable optimizer_version+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin+; +show variable+optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#begin; +-#show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin-#; +show variable optimizer_version-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin-#; +show variable-#optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/begin; +/show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin/; +show variable optimizer_version/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin/; +show variable/optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\begin; +\show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin\; +show variable optimizer_version\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin\; +show variable\optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?begin; +?show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin?; +show variable optimizer_version?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin?; +show variable?optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/begin; +-/show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin-/; +show variable optimizer_version-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin-/; +show variable-/optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#begin; +/#show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin/#; +show variable optimizer_version/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin/#; +show variable/#optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-begin; +/-show variable optimizer_version; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin/-; +show variable optimizer_version/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -begin/-; +show variable/-optimizer_version; NEW_CONNECTION; -start; +show variable return_commit_stats; NEW_CONNECTION; -START; +SHOW VARIABLE RETURN_COMMIT_STATS; NEW_CONNECTION; -start; +show variable return_commit_stats; NEW_CONNECTION; - start; + show variable return_commit_stats; NEW_CONNECTION; - start; + show variable return_commit_stats; NEW_CONNECTION; -start; +show variable return_commit_stats; NEW_CONNECTION; -start ; +show variable return_commit_stats ; NEW_CONNECTION; -start ; +show variable return_commit_stats ; NEW_CONNECTION; -start +show variable return_commit_stats ; NEW_CONNECTION; -start; +show variable return_commit_stats; NEW_CONNECTION; -start; +show variable return_commit_stats; NEW_CONNECTION; -start; +show +variable +return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo start; +foo show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start bar; +show variable return_commit_stats bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%start; +%show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start%; +show variable return_commit_stats%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start%; +show variable%return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_start; +_show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start_; +show variable return_commit_stats_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start_; +show variable_return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&start; +&show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start&; +show variable return_commit_stats&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start&; +show variable&return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$start; +$show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start$; +show variable return_commit_stats$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start$; +show variable$return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@start; +@show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start@; +show variable return_commit_stats@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start@; +show variable@return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!start; +!show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start!; +show variable return_commit_stats!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start!; +show variable!return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*start; +*show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start*; +show variable return_commit_stats*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start*; +show variable*return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(start; +(show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start(; +show variable return_commit_stats(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start(; +show variable(return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)start; +)show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start); +show variable return_commit_stats); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start); +show variable)return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --start; +-show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start-; +show variable return_commit_stats-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start-; +show variable-return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+start; ++show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start+; +show variable return_commit_stats+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start+; +show variable+return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#start; +-#show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start-#; +show variable return_commit_stats-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start-#; +show variable-#return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/start; +/show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start/; +show variable return_commit_stats/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start/; +show variable/return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\start; +\show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start\; +show variable return_commit_stats\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start\; +show variable\return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?start; +?show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start?; +show variable return_commit_stats?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start?; +show variable?return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/start; +-/show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start-/; +show variable return_commit_stats-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start-/; +show variable-/return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#start; +/#show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start/#; +show variable return_commit_stats/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start/#; +show variable/#return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-start; +/-show variable return_commit_stats; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start/-; +show variable return_commit_stats/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start/-; +show variable/-return_commit_stats; NEW_CONNECTION; -begin transaction; +update foo set bar=1; +show variable commit_response; NEW_CONNECTION; -BEGIN TRANSACTION; +update foo set bar=1; +SHOW VARIABLE COMMIT_RESPONSE; NEW_CONNECTION; -begin transaction; +update foo set bar=1; +show variable commit_response; NEW_CONNECTION; - begin transaction; +update foo set bar=1; + show variable commit_response; NEW_CONNECTION; - begin transaction; +update foo set bar=1; + show variable commit_response; NEW_CONNECTION; +update foo set bar=1; -begin transaction; +show variable commit_response; NEW_CONNECTION; -begin transaction ; +update foo set bar=1; +show variable commit_response ; NEW_CONNECTION; -begin transaction ; +update foo set bar=1; +show variable commit_response ; NEW_CONNECTION; -begin transaction +update foo set bar=1; +show variable commit_response ; NEW_CONNECTION; -begin transaction; +update foo set bar=1; +show variable commit_response; NEW_CONNECTION; -begin transaction; +update foo set bar=1; +show variable commit_response; NEW_CONNECTION; -begin -transaction; +update foo set bar=1; +show +variable +commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -foo begin transaction; +foo show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction bar; +show variable commit_response bar; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -%begin transaction; +%show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction%; +show variable commit_response%; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin%transaction; +show variable%commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -_begin transaction; +_show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction_; +show variable commit_response_; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin_transaction; +show variable_commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -&begin transaction; +&show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction&; +show variable commit_response&; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin&transaction; +show variable&commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -$begin transaction; +$show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction$; +show variable commit_response$; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin$transaction; +show variable$commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -@begin transaction; +@show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction@; +show variable commit_response@; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin@transaction; +show variable@commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -!begin transaction; +!show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction!; +show variable commit_response!; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin!transaction; +show variable!commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -*begin transaction; +*show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction*; +show variable commit_response*; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin*transaction; +show variable*commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -(begin transaction; +(show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction(; +show variable commit_response(; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin(transaction; +show variable(commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -)begin transaction; +)show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction); +show variable commit_response); NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin)transaction; +show variable)commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT --begin transaction; +-show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction-; +show variable commit_response-; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin-transaction; +show variable-commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -+begin transaction; ++show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction+; +show variable commit_response+; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin+transaction; +show variable+commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT --#begin transaction; +-#show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction-#; +show variable commit_response-#; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin-#transaction; +show variable-#commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -/begin transaction; +/show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction/; +show variable commit_response/; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin/transaction; +show variable/commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -\begin transaction; +\show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction\; +show variable commit_response\; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin\transaction; +show variable\commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -?begin transaction; +?show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction?; +show variable commit_response?; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin?transaction; +show variable?commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT --/begin transaction; +-/show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction-/; +show variable commit_response-/; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin-/transaction; +show variable-/commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -/#begin transaction; +/#show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction/#; +show variable commit_response/#; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin/#transaction; +show variable/#commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -/-begin transaction; +/-show variable commit_response; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin transaction/-; +show variable commit_response/-; NEW_CONNECTION; +update foo set bar=1; @EXPECT EXCEPTION INVALID_ARGUMENT -begin/-transaction; +show variable/-commit_response; NEW_CONNECTION; -start transaction; +begin; NEW_CONNECTION; -START TRANSACTION; +BEGIN; NEW_CONNECTION; -start transaction; +begin; NEW_CONNECTION; - start transaction; + begin; NEW_CONNECTION; - start transaction; + begin; NEW_CONNECTION; -start transaction; +begin; NEW_CONNECTION; -start transaction ; +begin ; NEW_CONNECTION; -start transaction ; +begin ; NEW_CONNECTION; -start transaction +begin ; NEW_CONNECTION; -start transaction; +begin; NEW_CONNECTION; -start transaction; +begin; NEW_CONNECTION; -start -transaction; +begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo start transaction; +foo begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction bar; +begin bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%start transaction; +%begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction%; +begin%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start%transaction; +begin%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_start transaction; +_begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction_; +begin_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start_transaction; +begin_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&start transaction; +&begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction&; +begin&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start&transaction; +begin&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$start transaction; +$begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction$; +begin$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start$transaction; +begin$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@start transaction; +@begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction@; +begin@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start@transaction; +begin@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!start transaction; +!begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction!; +begin!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start!transaction; +begin!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*start transaction; +*begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction*; +begin*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start*transaction; +begin*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(start transaction; +(begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction(; +begin(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start(transaction; +begin(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)start transaction; +)begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction); +begin); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start)transaction; +begin); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --start transaction; +-begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction-; +begin-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start-transaction; +begin-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+start transaction; ++begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction+; +begin+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start+transaction; +begin+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#start transaction; +-#begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction-#; +begin-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start-#transaction; +begin-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/start transaction; +/begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction/; +begin/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start/transaction; +begin/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\start transaction; +\begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction\; +begin\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start\transaction; +begin\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?start transaction; +?begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction?; +begin?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start?transaction; +begin?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/start transaction; +-/begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction-/; +begin-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start-/transaction; +begin-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#start transaction; +/#begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction/#; +begin/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start/#transaction; +begin/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-start transaction; +/-begin; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start transaction/-; +begin/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -start/-transaction; +begin/-; NEW_CONNECTION; -begin transaction; -commit; +start; NEW_CONNECTION; -begin transaction; -COMMIT; +START; NEW_CONNECTION; -begin transaction; -commit; +start; NEW_CONNECTION; -begin transaction; - commit; + start; NEW_CONNECTION; -begin transaction; - commit; + start; NEW_CONNECTION; -begin transaction; -commit; +start; NEW_CONNECTION; -begin transaction; -commit ; +start ; NEW_CONNECTION; -begin transaction; -commit ; +start ; NEW_CONNECTION; -begin transaction; -commit +start ; NEW_CONNECTION; -begin transaction; -commit; +start; NEW_CONNECTION; -begin transaction; -commit; +start; NEW_CONNECTION; -begin transaction; -commit; +start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -foo commit; +foo start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit bar; +start bar; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -%commit; +%start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit%; +start%; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit%; +start%; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -_commit; +_start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit_; +start_; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit_; +start_; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -&commit; +&start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit&; +start&; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit&; +start&; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -$commit; +$start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit$; +start$; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit$; +start$; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -@commit; +@start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit@; +start@; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit@; +start@; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -!commit; +!start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit!; +start!; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit!; +start!; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -*commit; +*start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit*; +start*; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit*; +start*; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -(commit; +(start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit(; +start(; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit(; +start(; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -)commit; +)start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit); +start); NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit); +start); NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --commit; +-start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit-; +start-; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit-; +start-; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -+commit; ++start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit+; +start+; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit+; +start+; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --#commit; +-#start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit-#; +start-#; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit-#; +start-#; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/commit; +/start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit/; +start/; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit/; +start/; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -\commit; +\start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit\; +start\; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit\; +start\; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -?commit; +?start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit?; +start?; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit?; +start?; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --/commit; +-/start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit-/; +start-/; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit-/; +start-/; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/#commit; +/#start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit/#; +start/#; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit/#; +start/#; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/-commit; +/-start; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit/-; +start/-; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit/-; +start/-; NEW_CONNECTION; begin transaction; -commit transaction; NEW_CONNECTION; -begin transaction; -COMMIT TRANSACTION; +BEGIN TRANSACTION; NEW_CONNECTION; begin transaction; -commit transaction; NEW_CONNECTION; -begin transaction; - commit transaction; + begin transaction; NEW_CONNECTION; -begin transaction; - commit transaction; + begin transaction; NEW_CONNECTION; -begin transaction; -commit transaction; -NEW_CONNECTION; begin transaction; -commit transaction ; NEW_CONNECTION; -begin transaction; -commit transaction ; +begin transaction ; NEW_CONNECTION; -begin transaction; -commit transaction +begin transaction ; +NEW_CONNECTION; +begin transaction ; NEW_CONNECTION; -begin transaction; -commit transaction; +begin transaction; NEW_CONNECTION; -begin transaction; -commit transaction; +begin transaction; NEW_CONNECTION; -begin transaction; -commit +begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -foo commit transaction; +foo begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction bar; +begin transaction bar; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -%commit transaction; +%begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction%; +begin transaction%; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit%transaction; +begin%transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -_commit transaction; +_begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction_; +begin transaction_; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit_transaction; +begin_transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -&commit transaction; +&begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction&; +begin transaction&; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit&transaction; +begin&transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -$commit transaction; +$begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction$; +begin transaction$; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit$transaction; +begin$transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -@commit transaction; +@begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction@; +begin transaction@; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit@transaction; +begin@transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -!commit transaction; +!begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction!; +begin transaction!; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit!transaction; +begin!transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -*commit transaction; +*begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction*; +begin transaction*; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit*transaction; +begin*transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -(commit transaction; +(begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction(; +begin transaction(; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit(transaction; +begin(transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -)commit transaction; +)begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction); +begin transaction); NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit)transaction; +begin)transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --commit transaction; +-begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction-; +begin transaction-; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit-transaction; +begin-transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -+commit transaction; ++begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction+; +begin transaction+; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit+transaction; +begin+transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --#commit transaction; +-#begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction-#; +begin transaction-#; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit-#transaction; +begin-#transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/commit transaction; +/begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction/; +begin transaction/; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit/transaction; +begin/transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -\commit transaction; +\begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction\; +begin transaction\; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit\transaction; +begin\transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -?commit transaction; +?begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction?; +begin transaction?; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit?transaction; +begin?transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --/commit transaction; +-/begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction-/; +begin transaction-/; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit-/transaction; +begin-/transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/#commit transaction; +/#begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction/#; +begin transaction/#; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit/#transaction; +begin/#transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/-commit transaction; +/-begin transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit transaction/-; +begin transaction/-; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -commit/-transaction; +begin/-transaction; NEW_CONNECTION; -begin transaction; -rollback; +start transaction; NEW_CONNECTION; -begin transaction; -ROLLBACK; +START TRANSACTION; NEW_CONNECTION; -begin transaction; -rollback; +start transaction; NEW_CONNECTION; -begin transaction; - rollback; + start transaction; NEW_CONNECTION; -begin transaction; - rollback; + start transaction; NEW_CONNECTION; -begin transaction; -rollback; +start transaction; NEW_CONNECTION; -begin transaction; -rollback ; +start transaction ; NEW_CONNECTION; -begin transaction; -rollback ; +start transaction ; NEW_CONNECTION; -begin transaction; -rollback +start transaction ; NEW_CONNECTION; -begin transaction; -rollback; +start transaction; NEW_CONNECTION; -begin transaction; -rollback; +start transaction; NEW_CONNECTION; -begin transaction; -rollback; +start +transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -foo rollback; +foo start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback bar; +start transaction bar; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -%rollback; +%start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback%; +start transaction%; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback%; +start%transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -_rollback; +_start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback_; +start transaction_; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback_; +start_transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -&rollback; +&start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback&; +start transaction&; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback&; +start&transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -$rollback; +$start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback$; +start transaction$; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback$; +start$transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -@rollback; +@start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback@; +start transaction@; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback@; +start@transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -!rollback; +!start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback!; +start transaction!; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback!; +start!transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -*rollback; +*start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback*; +start transaction*; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback*; +start*transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -(rollback; +(start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback(; +start transaction(; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback(; +start(transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -)rollback; +)start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback); +start transaction); NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback); +start)transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --rollback; +-start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback-; +start transaction-; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback-; +start-transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -+rollback; ++start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback+; +start transaction+; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback+; +start+transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --#rollback; +-#start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback-#; +start transaction-#; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback-#; +start-#transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/rollback; +/start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback/; +start transaction/; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback/; +start/transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -\rollback; +\start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback\; +start transaction\; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback\; +start\transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -?rollback; +?start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback?; +start transaction?; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback?; +start?transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --/rollback; +-/start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback-/; +start transaction-/; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback-/; +start-/transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/#rollback; +/#start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback/#; +start transaction/#; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback/#; +start/#transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/-rollback; +/-start transaction; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback/-; +start transaction/-; NEW_CONNECTION; -begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback/-; +start/-transaction; NEW_CONNECTION; begin transaction; -rollback transaction; +commit; NEW_CONNECTION; begin transaction; -ROLLBACK TRANSACTION; +COMMIT; NEW_CONNECTION; begin transaction; -rollback transaction; +commit; NEW_CONNECTION; begin transaction; - rollback transaction; + commit; NEW_CONNECTION; begin transaction; - rollback transaction; + commit; NEW_CONNECTION; begin transaction; -rollback transaction; +commit; NEW_CONNECTION; begin transaction; -rollback transaction ; +commit ; NEW_CONNECTION; begin transaction; -rollback transaction ; +commit ; NEW_CONNECTION; begin transaction; -rollback transaction +commit ; NEW_CONNECTION; begin transaction; -rollback transaction; +commit; NEW_CONNECTION; begin transaction; -rollback transaction; +commit; NEW_CONNECTION; begin transaction; -rollback -transaction; +commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -foo rollback transaction; +foo commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction bar; +commit bar; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -%rollback transaction; +%commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction%; +commit%; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback%transaction; +commit%; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -_rollback transaction; +_commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction_; +commit_; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback_transaction; +commit_; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -&rollback transaction; +&commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction&; +commit&; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback&transaction; +commit&; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -$rollback transaction; +$commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction$; +commit$; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback$transaction; +commit$; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -@rollback transaction; +@commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction@; +commit@; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback@transaction; +commit@; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -!rollback transaction; +!commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction!; +commit!; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback!transaction; +commit!; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -*rollback transaction; +*commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction*; +commit*; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback*transaction; +commit*; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -(rollback transaction; +(commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction(; +commit(; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback(transaction; +commit(; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -)rollback transaction; +)commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction); +commit); NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback)transaction; +commit); NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --rollback transaction; +-commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction-; +commit-; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback-transaction; +commit-; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -+rollback transaction; ++commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction+; +commit+; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback+transaction; +commit+; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --#rollback transaction; +-#commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction-#; +commit-#; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback-#transaction; +commit-#; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/rollback transaction; +/commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction/; +commit/; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback/transaction; +commit/; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -\rollback transaction; +\commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction\; +commit\; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback\transaction; +commit\; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -?rollback transaction; +?commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction?; +commit?; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback?transaction; +commit?; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --/rollback transaction; +-/commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction-/; +commit-/; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback-/transaction; +commit-/; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/#rollback transaction; +/#commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction/#; +commit/#; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback/#transaction; +commit/#; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/-rollback transaction; +/-commit; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback transaction/-; +commit/-; NEW_CONNECTION; begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -rollback/-transaction; +commit/-; NEW_CONNECTION; -start batch ddl; +begin transaction; +commit transaction; NEW_CONNECTION; -START BATCH DDL; +begin transaction; +COMMIT TRANSACTION; NEW_CONNECTION; -start batch ddl; +begin transaction; +commit transaction; NEW_CONNECTION; - start batch ddl; +begin transaction; + commit transaction; NEW_CONNECTION; - start batch ddl; +begin transaction; + commit transaction; NEW_CONNECTION; +begin transaction; -start batch ddl; +commit transaction; NEW_CONNECTION; -start batch ddl ; +begin transaction; +commit transaction ; NEW_CONNECTION; -start batch ddl ; +begin transaction; +commit transaction ; NEW_CONNECTION; -start batch ddl +begin transaction; +commit transaction ; NEW_CONNECTION; -start batch ddl; +begin transaction; +commit transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; +commit transaction; NEW_CONNECTION; -start -batch -ddl; +begin transaction; +commit +transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -foo start batch ddl; +foo commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl bar; +commit transaction bar; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -%start batch ddl; +%commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl%; +commit transaction%; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch%ddl; +commit%transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -_start batch ddl; +_commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl_; +commit transaction_; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch_ddl; +commit_transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -&start batch ddl; +&commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl&; +commit transaction&; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch&ddl; +commit&transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -$start batch ddl; +$commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl$; +commit transaction$; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch$ddl; +commit$transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -@start batch ddl; +@commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl@; +commit transaction@; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch@ddl; +commit@transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -!start batch ddl; +!commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl!; +commit transaction!; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch!ddl; +commit!transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -*start batch ddl; +*commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl*; +commit transaction*; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch*ddl; +commit*transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -(start batch ddl; +(commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl(; +commit transaction(; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch(ddl; +commit(transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -)start batch ddl; +)commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl); +commit transaction); NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch)ddl; +commit)transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --start batch ddl; +-commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl-; +commit transaction-; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch-ddl; +commit-transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -+start batch ddl; ++commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl+; +commit transaction+; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch+ddl; +commit+transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --#start batch ddl; +-#commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl-#; +commit transaction-#; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch-#ddl; +commit-#transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/start batch ddl; +/commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl/; +commit transaction/; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch/ddl; +commit/transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -\start batch ddl; +\commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl\; +commit transaction\; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch\ddl; +commit\transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -?start batch ddl; +?commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl?; +commit transaction?; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch?ddl; +commit?transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --/start batch ddl; +-/commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl-/; +commit transaction-/; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch-/ddl; +commit-/transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/#start batch ddl; +/#commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl/#; +commit transaction/#; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch/#ddl; +commit/#transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/-start batch ddl; +/-commit transaction; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch ddl/-; +commit transaction/-; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch/-ddl; +commit/-transaction; NEW_CONNECTION; -start batch dml; +begin transaction; +rollback; NEW_CONNECTION; -START BATCH DML; +begin transaction; +ROLLBACK; NEW_CONNECTION; -start batch dml; +begin transaction; +rollback; NEW_CONNECTION; - start batch dml; +begin transaction; + rollback; NEW_CONNECTION; - start batch dml; +begin transaction; + rollback; NEW_CONNECTION; +begin transaction; -start batch dml; +rollback; NEW_CONNECTION; -start batch dml ; +begin transaction; +rollback ; NEW_CONNECTION; -start batch dml ; +begin transaction; +rollback ; NEW_CONNECTION; -start batch dml +begin transaction; +rollback ; NEW_CONNECTION; -start batch dml; +begin transaction; +rollback; NEW_CONNECTION; -start batch dml; +begin transaction; +rollback; NEW_CONNECTION; -start -batch -dml; +begin transaction; +rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -foo start batch dml; +foo rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml bar; +rollback bar; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -%start batch dml; +%rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml%; +rollback%; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch%dml; +rollback%; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -_start batch dml; +_rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml_; +rollback_; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch_dml; +rollback_; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -&start batch dml; +&rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml&; +rollback&; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch&dml; +rollback&; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -$start batch dml; +$rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml$; +rollback$; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch$dml; +rollback$; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -@start batch dml; +@rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml@; +rollback@; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch@dml; +rollback@; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -!start batch dml; +!rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml!; +rollback!; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch!dml; +rollback!; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -*start batch dml; +*rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml*; +rollback*; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch*dml; +rollback*; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -(start batch dml; +(rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml(; +rollback(; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch(dml; +rollback(; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -)start batch dml; +)rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml); +rollback); NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch)dml; +rollback); NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --start batch dml; +-rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml-; +rollback-; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch-dml; +rollback-; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -+start batch dml; ++rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml+; +rollback+; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch+dml; +rollback+; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --#start batch dml; +-#rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml-#; +rollback-#; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch-#dml; +rollback-#; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/start batch dml; +/rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml/; +rollback/; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch/dml; +rollback/; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -\start batch dml; +\rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml\; +rollback\; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch\dml; +rollback\; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -?start batch dml; +?rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml?; +rollback?; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch?dml; +rollback?; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --/start batch dml; +-/rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml-/; +rollback-/; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch-/dml; +rollback-/; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/#start batch dml; +/#rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml/#; +rollback/#; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch/#dml; +rollback/#; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/-start batch dml; +/-rollback; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch dml/-; +rollback/-; NEW_CONNECTION; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -start batch/-dml; +rollback/-; NEW_CONNECTION; -start batch ddl; -run batch; +begin transaction; +rollback transaction; NEW_CONNECTION; -start batch ddl; -RUN BATCH; +begin transaction; +ROLLBACK TRANSACTION; NEW_CONNECTION; -start batch ddl; -run batch; +begin transaction; +rollback transaction; NEW_CONNECTION; -start batch ddl; - run batch; +begin transaction; + rollback transaction; NEW_CONNECTION; -start batch ddl; - run batch; +begin transaction; + rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; -run batch; +rollback transaction; NEW_CONNECTION; -start batch ddl; -run batch ; +begin transaction; +rollback transaction ; NEW_CONNECTION; -start batch ddl; -run batch ; +begin transaction; +rollback transaction ; NEW_CONNECTION; -start batch ddl; -run batch +begin transaction; +rollback transaction ; NEW_CONNECTION; -start batch ddl; -run batch; +begin transaction; +rollback transaction; NEW_CONNECTION; -start batch ddl; -run batch; +begin transaction; +rollback transaction; NEW_CONNECTION; -start batch ddl; -run -batch; +begin transaction; +rollback +transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -foo run batch; +foo rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch bar; +rollback transaction bar; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -%run batch; +%rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch%; +rollback transaction%; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run%batch; +rollback%transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -_run batch; +_rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch_; +rollback transaction_; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run_batch; +rollback_transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -&run batch; +&rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch&; +rollback transaction&; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run&batch; +rollback&transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -$run batch; +$rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch$; +rollback transaction$; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run$batch; +rollback$transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -@run batch; +@rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch@; +rollback transaction@; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run@batch; +rollback@transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -!run batch; +!rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch!; +rollback transaction!; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run!batch; +rollback!transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -*run batch; +*rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch*; +rollback transaction*; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run*batch; +rollback*transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -(run batch; +(rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch(; +rollback transaction(; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run(batch; +rollback(transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -)run batch; +)rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch); +rollback transaction); NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run)batch; +rollback)transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --run batch; +-rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch-; +rollback transaction-; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run-batch; +rollback-transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -+run batch; ++rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch+; +rollback transaction+; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run+batch; +rollback+transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --#run batch; +-#rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch-#; +rollback transaction-#; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run-#batch; +rollback-#transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/run batch; +/rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch/; +rollback transaction/; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run/batch; +rollback/transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -\run batch; +\rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch\; +rollback transaction\; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run\batch; +rollback\transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -?run batch; +?rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch?; +rollback transaction?; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run?batch; +rollback?transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT --/run batch; +-/rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch-/; +rollback transaction-/; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run-/batch; +rollback-/transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/#run batch; +/#rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch/#; +rollback transaction/#; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run/#batch; +rollback/#transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -/-run batch; +/-rollback transaction; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run batch/-; +rollback transaction/-; NEW_CONNECTION; -start batch ddl; +begin transaction; @EXPECT EXCEPTION INVALID_ARGUMENT -run/-batch; +rollback/-transaction; NEW_CONNECTION; start batch ddl; -abort batch; NEW_CONNECTION; -start batch ddl; -ABORT BATCH; +START BATCH DDL; NEW_CONNECTION; start batch ddl; -abort batch; NEW_CONNECTION; -start batch ddl; - abort batch; + start batch ddl; NEW_CONNECTION; -start batch ddl; - abort batch; + start batch ddl; NEW_CONNECTION; -start batch ddl; -abort batch; -NEW_CONNECTION; start batch ddl; -abort batch ; NEW_CONNECTION; -start batch ddl; -abort batch ; +start batch ddl ; NEW_CONNECTION; -start batch ddl; -abort batch +start batch ddl ; +NEW_CONNECTION; +start batch ddl ; NEW_CONNECTION; -start batch ddl; -abort batch; +start batch ddl; NEW_CONNECTION; -start batch ddl; -abort batch; +start batch ddl; NEW_CONNECTION; -start batch ddl; -abort -batch; +start +batch +ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -foo abort batch; +foo start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch bar; +start batch ddl bar; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -%abort batch; +%start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch%; +start batch ddl%; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort%batch; +start batch%ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -_abort batch; +_start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch_; +start batch ddl_; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort_batch; +start batch_ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -&abort batch; +&start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch&; +start batch ddl&; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort&batch; +start batch&ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -$abort batch; +$start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch$; +start batch ddl$; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort$batch; +start batch$ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -@abort batch; +@start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch@; +start batch ddl@; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort@batch; +start batch@ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -!abort batch; +!start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch!; +start batch ddl!; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort!batch; +start batch!ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -*abort batch; +*start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch*; +start batch ddl*; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort*batch; +start batch*ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -(abort batch; +(start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch(; +start batch ddl(; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort(batch; +start batch(ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -)abort batch; +)start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch); +start batch ddl); NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort)batch; +start batch)ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT --abort batch; +-start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch-; +start batch ddl-; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort-batch; +start batch-ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -+abort batch; ++start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch+; +start batch ddl+; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort+batch; +start batch+ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT --#abort batch; +-#start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch-#; +start batch ddl-#; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort-#batch; +start batch-#ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -/abort batch; +/start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch/; +start batch ddl/; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort/batch; +start batch/ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -\abort batch; +\start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch\; +start batch ddl\; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort\batch; +start batch\ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -?abort batch; +?start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch?; +start batch ddl?; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort?batch; +start batch?ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT --/abort batch; +-/start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch-/; +start batch ddl-/; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort-/batch; +start batch-/ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -/#abort batch; +/#start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch/#; +start batch ddl/#; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort/#batch; +start batch/#ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -/-abort batch; +/-start batch ddl; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort batch/-; +start batch ddl/-; NEW_CONNECTION; -start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -abort/-batch; +start batch/-ddl; NEW_CONNECTION; -set autocommit = true; +start batch dml; NEW_CONNECTION; -SET AUTOCOMMIT = TRUE; +START BATCH DML; NEW_CONNECTION; -set autocommit = true; +start batch dml; NEW_CONNECTION; - set autocommit = true; + start batch dml; NEW_CONNECTION; - set autocommit = true; + start batch dml; NEW_CONNECTION; -set autocommit = true; +start batch dml; NEW_CONNECTION; -set autocommit = true ; +start batch dml ; NEW_CONNECTION; -set autocommit = true ; +start batch dml ; NEW_CONNECTION; -set autocommit = true +start batch dml ; NEW_CONNECTION; -set autocommit = true; +start batch dml; NEW_CONNECTION; -set autocommit = true; +start batch dml; NEW_CONNECTION; -set -autocommit -= -true; +start +batch +dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set autocommit = true; +foo start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true bar; +start batch dml bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set autocommit = true; +%start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true%; +start batch dml%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =%true; +start batch%dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set autocommit = true; +_start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true_; +start batch dml_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =_true; +start batch_dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set autocommit = true; +&start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true&; +start batch dml&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =&true; +start batch&dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set autocommit = true; +$start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true$; +start batch dml$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =$true; +start batch$dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set autocommit = true; +@start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true@; +start batch dml@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =@true; +start batch@dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set autocommit = true; +!start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true!; +start batch dml!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =!true; +start batch!dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set autocommit = true; +*start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true*; +start batch dml*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =*true; +start batch*dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set autocommit = true; +(start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true(; +start batch dml(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =(true; +start batch(dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set autocommit = true; +)start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true); +start batch dml); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =)true; +start batch)dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set autocommit = true; +-start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true-; +start batch dml-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =-true; +start batch-dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set autocommit = true; ++start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true+; +start batch dml+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =+true; +start batch+dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set autocommit = true; +-#start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true-#; +start batch dml-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =-#true; +start batch-#dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set autocommit = true; +/start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true/; +start batch dml/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =/true; +start batch/dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set autocommit = true; +\start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true\; +start batch dml\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =\true; +start batch\dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set autocommit = true; +?start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true?; +start batch dml?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =?true; +start batch?dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set autocommit = true; +-/start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true-/; +start batch dml-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =-/true; +start batch-/dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set autocommit = true; +/#start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true/#; +start batch dml/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =/#true; +start batch/#dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set autocommit = true; +/-start batch dml; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = true/-; +start batch dml/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =/-true; +start batch/-dml; NEW_CONNECTION; -set autocommit = false; +start batch ddl; +run batch; NEW_CONNECTION; -SET AUTOCOMMIT = FALSE; +start batch ddl; +RUN BATCH; NEW_CONNECTION; -set autocommit = false; +start batch ddl; +run batch; NEW_CONNECTION; - set autocommit = false; +start batch ddl; + run batch; NEW_CONNECTION; - set autocommit = false; +start batch ddl; + run batch; NEW_CONNECTION; +start batch ddl; -set autocommit = false; +run batch; NEW_CONNECTION; -set autocommit = false ; +start batch ddl; +run batch ; NEW_CONNECTION; -set autocommit = false ; +start batch ddl; +run batch ; NEW_CONNECTION; -set autocommit = false +start batch ddl; +run batch ; NEW_CONNECTION; -set autocommit = false; +start batch ddl; +run batch; NEW_CONNECTION; -set autocommit = false; +start batch ddl; +run batch; NEW_CONNECTION; -set -autocommit -= -false; +start batch ddl; +run +batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set autocommit = false; +foo run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false bar; +run batch bar; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -%set autocommit = false; +%run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false%; +run batch%; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =%false; +run%batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -_set autocommit = false; +_run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false_; +run batch_; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =_false; +run_batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -&set autocommit = false; +&run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false&; +run batch&; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =&false; +run&batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -$set autocommit = false; +$run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false$; +run batch$; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =$false; +run$batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -@set autocommit = false; +@run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false@; +run batch@; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =@false; +run@batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -!set autocommit = false; +!run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false!; +run batch!; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =!false; +run!batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -*set autocommit = false; +*run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false*; +run batch*; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =*false; +run*batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -(set autocommit = false; +(run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false(; +run batch(; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =(false; +run(batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -)set autocommit = false; +)run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false); +run batch); NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =)false; +run)batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT --set autocommit = false; +-run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false-; +run batch-; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =-false; +run-batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -+set autocommit = false; ++run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false+; +run batch+; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =+false; +run+batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT --#set autocommit = false; +-#run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false-#; +run batch-#; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =-#false; +run-#batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -/set autocommit = false; +/run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false/; +run batch/; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =/false; +run/batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -\set autocommit = false; +\run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false\; +run batch\; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =\false; +run\batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -?set autocommit = false; +?run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false?; +run batch?; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =?false; +run?batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT --/set autocommit = false; +-/run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false-/; +run batch-/; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =-/false; +run-/batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set autocommit = false; +/#run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false/#; +run batch/#; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =/#false; +run/#batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set autocommit = false; +/-run batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit = false/-; +run batch/-; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit =/-false; +run/-batch; NEW_CONNECTION; -set readonly = true; +start batch ddl; +abort batch; NEW_CONNECTION; -SET READONLY = TRUE; +start batch ddl; +ABORT BATCH; NEW_CONNECTION; -set readonly = true; +start batch ddl; +abort batch; NEW_CONNECTION; - set readonly = true; +start batch ddl; + abort batch; NEW_CONNECTION; - set readonly = true; +start batch ddl; + abort batch; NEW_CONNECTION; +start batch ddl; -set readonly = true; +abort batch; NEW_CONNECTION; -set readonly = true ; +start batch ddl; +abort batch ; NEW_CONNECTION; -set readonly = true ; +start batch ddl; +abort batch ; NEW_CONNECTION; -set readonly = true +start batch ddl; +abort batch ; NEW_CONNECTION; -set readonly = true; +start batch ddl; +abort batch; NEW_CONNECTION; -set readonly = true; +start batch ddl; +abort batch; NEW_CONNECTION; -set -readonly -= -true; +start batch ddl; +abort +batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set readonly = true; +foo abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true bar; +abort batch bar; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -%set readonly = true; +%abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true%; +abort batch%; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =%true; +abort%batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -_set readonly = true; +_abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true_; +abort batch_; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =_true; +abort_batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -&set readonly = true; +&abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true&; +abort batch&; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =&true; +abort&batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -$set readonly = true; +$abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true$; +abort batch$; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =$true; +abort$batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -@set readonly = true; +@abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true@; +abort batch@; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =@true; +abort@batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -!set readonly = true; +!abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true!; +abort batch!; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =!true; +abort!batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -*set readonly = true; +*abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true*; +abort batch*; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =*true; +abort*batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -(set readonly = true; +(abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true(; +abort batch(; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =(true; +abort(batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -)set readonly = true; +)abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true); +abort batch); NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =)true; +abort)batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT --set readonly = true; +-abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true-; +abort batch-; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =-true; +abort-batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -+set readonly = true; ++abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true+; +abort batch+; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =+true; +abort+batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT --#set readonly = true; +-#abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true-#; +abort batch-#; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =-#true; +abort-#batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -/set readonly = true; +/abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true/; +abort batch/; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =/true; +abort/batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -\set readonly = true; +\abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true\; +abort batch\; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =\true; +abort\batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -?set readonly = true; +?abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true?; +abort batch?; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =?true; +abort?batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT --/set readonly = true; +-/abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true-/; +abort batch-/; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =-/true; +abort-/batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set readonly = true; +/#abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true/#; +abort batch/#; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =/#true; +abort/#batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set readonly = true; +/-abort batch; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = true/-; +abort batch/-; NEW_CONNECTION; +start batch ddl; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =/-true; +abort/-batch; NEW_CONNECTION; -set readonly = false; +set autocommit = true; NEW_CONNECTION; -SET READONLY = FALSE; +SET AUTOCOMMIT = TRUE; NEW_CONNECTION; -set readonly = false; +set autocommit = true; NEW_CONNECTION; - set readonly = false; + set autocommit = true; NEW_CONNECTION; - set readonly = false; + set autocommit = true; NEW_CONNECTION; -set readonly = false; +set autocommit = true; NEW_CONNECTION; -set readonly = false ; +set autocommit = true ; NEW_CONNECTION; -set readonly = false ; +set autocommit = true ; NEW_CONNECTION; -set readonly = false +set autocommit = true ; NEW_CONNECTION; -set readonly = false; +set autocommit = true; NEW_CONNECTION; -set readonly = false; +set autocommit = true; NEW_CONNECTION; set -readonly +autocommit = -false; +true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set readonly = false; +foo set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false bar; +set autocommit = true bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set readonly = false; +%set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false%; +set autocommit = true%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =%false; +set autocommit =%true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set readonly = false; +_set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false_; +set autocommit = true_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =_false; +set autocommit =_true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set readonly = false; +&set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false&; +set autocommit = true&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =&false; +set autocommit =&true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set readonly = false; +$set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false$; +set autocommit = true$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =$false; +set autocommit =$true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set readonly = false; +@set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false@; +set autocommit = true@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =@false; +set autocommit =@true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set readonly = false; +!set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false!; +set autocommit = true!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =!false; +set autocommit =!true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set readonly = false; +*set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false*; +set autocommit = true*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =*false; +set autocommit =*true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set readonly = false; +(set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false(; +set autocommit = true(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =(false; +set autocommit =(true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set readonly = false; +)set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false); +set autocommit = true); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =)false; +set autocommit =)true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set readonly = false; +-set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false-; +set autocommit = true-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =-false; +set autocommit =-true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set readonly = false; ++set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false+; +set autocommit = true+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =+false; +set autocommit =+true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set readonly = false; +-#set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false-#; +set autocommit = true-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =-#false; +set autocommit =-#true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set readonly = false; +/set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false/; +set autocommit = true/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =/false; +set autocommit =/true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set readonly = false; +\set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false\; +set autocommit = true\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =\false; +set autocommit =\true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set readonly = false; +?set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false?; +set autocommit = true?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =?false; +set autocommit =?true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set readonly = false; +-/set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false-/; +set autocommit = true-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =-/false; +set autocommit =-/true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set readonly = false; +/#set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false/#; +set autocommit = true/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =/#false; +set autocommit =/#true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set readonly = false; +/-set autocommit = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly = false/-; +set autocommit = true/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set readonly =/-false; +set autocommit =/-true; NEW_CONNECTION; -set readonly = false; set autocommit = false; -set retry_aborts_internally = true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -SET RETRY_ABORTS_INTERNALLY = TRUE; +SET AUTOCOMMIT = FALSE; NEW_CONNECTION; -set readonly = false; set autocommit = false; -set retry_aborts_internally = true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; - set retry_aborts_internally = true; + set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; - set retry_aborts_internally = true; + set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = true; -NEW_CONNECTION; -set readonly = false; set autocommit = false; -set retry_aborts_internally = true ; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = true ; +set autocommit = false ; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = true +set autocommit = false ; +NEW_CONNECTION; +set autocommit = false ; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = true; +set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = true; +set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; set -retry_aborts_internally +autocommit = -true; +false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set retry_aborts_internally = true; +foo set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true bar; +set autocommit = false bar; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -%set retry_aborts_internally = true; +%set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true%; +set autocommit = false%; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =%true; +set autocommit =%false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -_set retry_aborts_internally = true; +_set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true_; +set autocommit = false_; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =_true; +set autocommit =_false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -&set retry_aborts_internally = true; +&set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true&; +set autocommit = false&; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =&true; +set autocommit =&false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -$set retry_aborts_internally = true; +$set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true$; +set autocommit = false$; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =$true; +set autocommit =$false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -@set retry_aborts_internally = true; +@set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true@; +set autocommit = false@; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =@true; +set autocommit =@false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -!set retry_aborts_internally = true; +!set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true!; +set autocommit = false!; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =!true; +set autocommit =!false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -*set retry_aborts_internally = true; +*set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true*; +set autocommit = false*; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =*true; +set autocommit =*false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -(set retry_aborts_internally = true; +(set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true(; +set autocommit = false(; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =(true; +set autocommit =(false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -)set retry_aborts_internally = true; +)set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true); +set autocommit = false); NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =)true; +set autocommit =)false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --set retry_aborts_internally = true; +-set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true-; +set autocommit = false-; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =-true; +set autocommit =-false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -+set retry_aborts_internally = true; ++set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true+; +set autocommit = false+; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =+true; +set autocommit =+false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --#set retry_aborts_internally = true; +-#set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true-#; +set autocommit = false-#; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =-#true; +set autocommit =-#false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/set retry_aborts_internally = true; +/set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true/; +set autocommit = false/; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =/true; +set autocommit =/false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -\set retry_aborts_internally = true; +\set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true\; +set autocommit = false\; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =\true; +set autocommit =\false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -?set retry_aborts_internally = true; +?set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true?; +set autocommit = false?; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =?true; +set autocommit =?false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --/set retry_aborts_internally = true; +-/set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true-/; +set autocommit = false-/; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =-/true; +set autocommit =-/false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set retry_aborts_internally = true; +/#set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true/#; +set autocommit = false/#; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =/#true; +set autocommit =/#false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set retry_aborts_internally = true; +/-set autocommit = false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = true/-; +set autocommit = false/-; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =/-true; +set autocommit =/-false; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = false; +set readonly = true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -SET RETRY_ABORTS_INTERNALLY = FALSE; +SET READONLY = TRUE; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = false; +set readonly = true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; - set retry_aborts_internally = false; + set readonly = true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; - set retry_aborts_internally = false; + set readonly = true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = false; +set readonly = true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = false ; +set readonly = true ; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = false ; +set readonly = true ; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = false +set readonly = true ; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = false; +set readonly = true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; -set retry_aborts_internally = false; +set readonly = true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; set -retry_aborts_internally +readonly = -false; +true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set retry_aborts_internally = false; +foo set readonly = true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false bar; +set readonly = true bar; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -%set retry_aborts_internally = false; +%set readonly = true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false%; +set readonly = true%; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =%false; +set readonly =%true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -_set retry_aborts_internally = false; +_set readonly = true; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false_; +set readonly = true_; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =_false; +set readonly =_true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +&set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true&; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =&true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +$set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true$; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =$true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +@set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true@; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =@true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +!set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true!; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =!true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +*set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true*; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =*true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +(set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true(; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =(true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +)set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true); +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =)true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =-true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT ++set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true+; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =+true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-#set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true-#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =-#true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =/true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +\set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true\; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =\true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +?set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true?; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =?true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-/set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true-/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =-/true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/#set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true/#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =/#true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/-set readonly = true; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = true/-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =/-true; NEW_CONNECTION; set readonly = false; -set autocommit = false; +NEW_CONNECTION; +SET READONLY = FALSE; +NEW_CONNECTION; +set readonly = false; +NEW_CONNECTION; + set readonly = false; +NEW_CONNECTION; + set readonly = false; +NEW_CONNECTION; + + + +set readonly = false; +NEW_CONNECTION; +set readonly = false ; +NEW_CONNECTION; +set readonly = false ; +NEW_CONNECTION; +set readonly = false + +; +NEW_CONNECTION; +set readonly = false; +NEW_CONNECTION; +set readonly = false; +NEW_CONNECTION; +set +readonly += +false; +NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set retry_aborts_internally = false; +foo set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false bar; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +%set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false%; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =%false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +_set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false_; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =_false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +&set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false&; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =&false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +$set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false$; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =$false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +@set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false@; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =@false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +!set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false!; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =!false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +*set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false*; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =*false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +(set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false(; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =(false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +)set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false); +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =)false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =-false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT ++set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false+; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =+false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-#set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false-#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =-#false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =/false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +\set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false\; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =\false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +?set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false?; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =?false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-/set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false-/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =-/false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/#set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false/#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =/#false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/-set readonly = false; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly = false/-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set readonly =/-false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +SET RETRY_ABORTS_INTERNALLY = TRUE; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; + set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; + set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; + + + +set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = true ; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = true ; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = true + +; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set +retry_aborts_internally += +true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +foo set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true bar; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +%set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true%; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =%true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +_set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true_; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =_true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +&set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true&; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =&true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +$set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true$; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =$true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +@set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true@; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =@true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +!set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true!; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =!true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +*set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true*; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =*true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +(set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true(; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =(true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +)set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true); +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =)true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +-set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true-; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =-true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT ++set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true+; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =+true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +-#set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true-#; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =-#true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +/set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true/; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =/true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +\set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true\; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =\true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +?set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true?; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =?true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +-/set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true-/; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =-/true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +/#set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true/#; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =/#true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +/-set retry_aborts_internally = true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = true/-; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =/-true; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +SET RETRY_ABORTS_INTERNALLY = FALSE; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; + set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; + set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; + + + +set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = false ; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = false ; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = false + +; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +set +retry_aborts_internally += +false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +foo set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false bar; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +%set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false%; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =%false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +_set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false_; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =_false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +&set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false&; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =&false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +$set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false$; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =$false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +@set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false@; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =@false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +!set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false!; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =!false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +*set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false*; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =*false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +(set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false(; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =(false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +)set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false); +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =)false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +-set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false-; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =-false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT ++set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false+; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =+false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +-#set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false-#; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =-#false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +/set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false/; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =/false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +\set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false\; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =\false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +?set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false?; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =?false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +-/set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false-/; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =-/false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +/#set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false/#; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =/#false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +/-set retry_aborts_internally = false; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally = false/-; +NEW_CONNECTION; +set readonly = false; +set autocommit = false; +@EXPECT EXCEPTION INVALID_ARGUMENT +set retry_aborts_internally =/-false; +NEW_CONNECTION; +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +set autocommit_dml_mode='partitioned_non_atomic'; +NEW_CONNECTION; + set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; + set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; + + + +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC' ; +NEW_CONNECTION; +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC' ; +NEW_CONNECTION; +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC' + +; +NEW_CONNECTION; +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +set +autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +foo set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC' bar; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +%set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'%; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set%autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +_set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'_; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set_autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +&set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'&; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set&autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +$set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'$; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set$autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +@set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'@; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set@autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +!set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'!; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set!autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +*set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'*; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set*autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +(set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'(; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set(autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +)set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'); +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set)autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT ++set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'+; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set+autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-#set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'-#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-#autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +\set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'\; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set\autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +?set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'?; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set?autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-/set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'-/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-/autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/#set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'/#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/#autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/-set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'/-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/-autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +NEW_CONNECTION; +set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL'; +NEW_CONNECTION; +set autocommit_dml_mode='transactional'; +NEW_CONNECTION; + set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; + set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; + + + +set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +set autocommit_dml_mode='TRANSACTIONAL' ; +NEW_CONNECTION; +set autocommit_dml_mode='TRANSACTIONAL' ; +NEW_CONNECTION; +set autocommit_dml_mode='TRANSACTIONAL' + +; +NEW_CONNECTION; +set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +set +autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +foo set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL' bar; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +%set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'%; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set%autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +_set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'_; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set_autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +&set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'&; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set&autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +$set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'$; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set$autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +@set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'@; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set@autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +!set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'!; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set!autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +*set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'*; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set*autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +(set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'(; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set(autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +)set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'); +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set)autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT ++set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'+; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set+autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-#set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'-#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-#autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +\set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'\; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set\autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +?set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'?; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set?autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-/set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'-/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-/autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/#set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'/#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/#autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/-set autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set autocommit_dml_mode='TRANSACTIONAL'/-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/-autocommit_dml_mode='TRANSACTIONAL'; +NEW_CONNECTION; +set statement_timeout=null; +NEW_CONNECTION; +SET STATEMENT_TIMEOUT=NULL; +NEW_CONNECTION; +set statement_timeout=null; +NEW_CONNECTION; + set statement_timeout=null; +NEW_CONNECTION; + set statement_timeout=null; +NEW_CONNECTION; + + + +set statement_timeout=null; +NEW_CONNECTION; +set statement_timeout=null ; +NEW_CONNECTION; +set statement_timeout=null ; +NEW_CONNECTION; +set statement_timeout=null + +; +NEW_CONNECTION; +set statement_timeout=null; +NEW_CONNECTION; +set statement_timeout=null; +NEW_CONNECTION; +set +statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +foo set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null bar; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +%set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null%; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set%statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +_set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null_; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set_statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +&set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null&; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set&statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +$set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null$; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set$statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +@set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null@; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set@statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +!set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null!; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set!statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +*set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null*; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set*statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +(set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null(; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set(statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +)set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null); +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set)statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT ++set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null+; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set+statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-#set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null-#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-#statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +\set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null\; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set\statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +?set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null?; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set?statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-/set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null-/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-/statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/#set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null/#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/#statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/-set statement_timeout=null; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout=null/-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/-statement_timeout=null; +NEW_CONNECTION; +set statement_timeout='1s'; +NEW_CONNECTION; +SET STATEMENT_TIMEOUT='1S'; +NEW_CONNECTION; +set statement_timeout='1s'; +NEW_CONNECTION; + set statement_timeout='1s'; +NEW_CONNECTION; + set statement_timeout='1s'; +NEW_CONNECTION; + + + +set statement_timeout='1s'; +NEW_CONNECTION; +set statement_timeout='1s' ; +NEW_CONNECTION; +set statement_timeout='1s' ; +NEW_CONNECTION; +set statement_timeout='1s' + +; +NEW_CONNECTION; +set statement_timeout='1s'; +NEW_CONNECTION; +set statement_timeout='1s'; +NEW_CONNECTION; +set +statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +foo set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s' bar; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +%set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'%; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set%statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +_set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'_; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set_statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +&set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'&; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set&statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +$set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'$; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set$statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +@set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'@; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set@statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +!set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'!; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set!statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +*set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'*; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set*statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +(set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'(; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set(statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +)set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'); +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set)statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT ++set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'+; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set+statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-#set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'-#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-#statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +\set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'\; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set\statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +?set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'?; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set?statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-/set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'-/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-/statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/#set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'/#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/#statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/-set statement_timeout='1s'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='1s'/-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/-statement_timeout='1s'; +NEW_CONNECTION; +set statement_timeout='100ms'; +NEW_CONNECTION; +SET STATEMENT_TIMEOUT='100MS'; +NEW_CONNECTION; +set statement_timeout='100ms'; +NEW_CONNECTION; + set statement_timeout='100ms'; +NEW_CONNECTION; + set statement_timeout='100ms'; +NEW_CONNECTION; + + + +set statement_timeout='100ms'; +NEW_CONNECTION; +set statement_timeout='100ms' ; +NEW_CONNECTION; +set statement_timeout='100ms' ; +NEW_CONNECTION; +set statement_timeout='100ms' + +; +NEW_CONNECTION; +set statement_timeout='100ms'; +NEW_CONNECTION; +set statement_timeout='100ms'; +NEW_CONNECTION; +set +statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +foo set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms' bar; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +%set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'%; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set%statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +_set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'_; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set_statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +&set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'&; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set&statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +$set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'$; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set$statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +@set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'@; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set@statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +!set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'!; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set!statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +*set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'*; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set*statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +(set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'(; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set(statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +)set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'); +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set)statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT ++set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'+; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set+statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-#set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'-#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-#statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +\set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'\; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set\statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +?set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'?; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set?statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +-/set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'-/; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set-/statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/#set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'/#; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/#statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +/-set statement_timeout='100ms'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='100ms'/-; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set/-statement_timeout='100ms'; +NEW_CONNECTION; +set statement_timeout='10000us'; +NEW_CONNECTION; +SET STATEMENT_TIMEOUT='10000US'; +NEW_CONNECTION; +set statement_timeout='10000us'; +NEW_CONNECTION; + set statement_timeout='10000us'; +NEW_CONNECTION; + set statement_timeout='10000us'; +NEW_CONNECTION; + + + +set statement_timeout='10000us'; +NEW_CONNECTION; +set statement_timeout='10000us' ; +NEW_CONNECTION; +set statement_timeout='10000us' ; +NEW_CONNECTION; +set statement_timeout='10000us' + +; +NEW_CONNECTION; +set statement_timeout='10000us'; +NEW_CONNECTION; +set statement_timeout='10000us'; +NEW_CONNECTION; +set +statement_timeout='10000us'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +foo set statement_timeout='10000us'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='10000us' bar; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +%set statement_timeout='10000us'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='10000us'%; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set%statement_timeout='10000us'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +_set statement_timeout='10000us'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set statement_timeout='10000us'_; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +set_statement_timeout='10000us'; +NEW_CONNECTION; +@EXPECT EXCEPTION INVALID_ARGUMENT +&set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false&; +set statement_timeout='10000us'&; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =&false; +set&statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -$set retry_aborts_internally = false; +$set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false$; +set statement_timeout='10000us'$; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =$false; +set$statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -@set retry_aborts_internally = false; +@set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false@; +set statement_timeout='10000us'@; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =@false; +set@statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -!set retry_aborts_internally = false; +!set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false!; +set statement_timeout='10000us'!; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =!false; +set!statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -*set retry_aborts_internally = false; +*set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false*; +set statement_timeout='10000us'*; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =*false; +set*statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -(set retry_aborts_internally = false; +(set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false(; +set statement_timeout='10000us'(; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =(false; +set(statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -)set retry_aborts_internally = false; +)set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false); +set statement_timeout='10000us'); NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =)false; +set)statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --set retry_aborts_internally = false; +-set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false-; +set statement_timeout='10000us'-; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =-false; +set-statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -+set retry_aborts_internally = false; ++set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false+; +set statement_timeout='10000us'+; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =+false; +set+statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --#set retry_aborts_internally = false; +-#set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false-#; +set statement_timeout='10000us'-#; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =-#false; +set-#statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/set retry_aborts_internally = false; +/set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false/; +set statement_timeout='10000us'/; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =/false; +set/statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -\set retry_aborts_internally = false; +\set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false\; +set statement_timeout='10000us'\; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =\false; +set\statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -?set retry_aborts_internally = false; +?set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false?; +set statement_timeout='10000us'?; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =?false; +set?statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --/set retry_aborts_internally = false; +-/set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false-/; +set statement_timeout='10000us'-/; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =-/false; +set-/statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set retry_aborts_internally = false; +/#set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false/#; +set statement_timeout='10000us'/#; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =/#false; +set/#statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set retry_aborts_internally = false; +/-set statement_timeout='10000us'; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally = false/-; +set statement_timeout='10000us'/-; NEW_CONNECTION; -set readonly = false; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set retry_aborts_internally =/-false; +set/-statement_timeout='10000us'; NEW_CONNECTION; -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; -SET AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'; +SET STATEMENT_TIMEOUT='9223372036854775807NS'; NEW_CONNECTION; -set autocommit_dml_mode='partitioned_non_atomic'; +set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; - set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; + set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; - set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; + set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC' ; +set statement_timeout='9223372036854775807ns' ; NEW_CONNECTION; -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC' ; +set statement_timeout='9223372036854775807ns' ; NEW_CONNECTION; -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC' +set statement_timeout='9223372036854775807ns' ; NEW_CONNECTION; -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; set -autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +foo set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC' bar; +set statement_timeout='9223372036854775807ns' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +%set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'%; +set statement_timeout='9223372036854775807ns'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set%autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set%statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +_set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'_; +set statement_timeout='9223372036854775807ns'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set_autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set_statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +&set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'&; +set statement_timeout='9223372036854775807ns'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set&autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set&statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +$set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'$; +set statement_timeout='9223372036854775807ns'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set$autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set$statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +@set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'@; +set statement_timeout='9223372036854775807ns'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set@autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set@statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +!set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'!; +set statement_timeout='9223372036854775807ns'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set!autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set!statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +*set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'*; +set statement_timeout='9223372036854775807ns'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set*autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set*statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +(set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'(; +set statement_timeout='9223372036854775807ns'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set(autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set(statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +)set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'); +set statement_timeout='9223372036854775807ns'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set)autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set)statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +-set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'-; +set statement_timeout='9223372036854775807ns'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set-statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; ++set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'+; +set statement_timeout='9223372036854775807ns'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set+autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set+statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +-#set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'-#; +set statement_timeout='9223372036854775807ns'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-#autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set-#statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +/set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'/; +set statement_timeout='9223372036854775807ns'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set/statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +\set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'\; +set statement_timeout='9223372036854775807ns'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set\autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set\statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +?set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'?; +set statement_timeout='9223372036854775807ns'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set?autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set?statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +-/set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'-/; +set statement_timeout='9223372036854775807ns'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-/autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set-/statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +/#set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'/#; +set statement_timeout='9223372036854775807ns'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/#autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set/#statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +/-set statement_timeout='9223372036854775807ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='PARTITIONED_NON_ATOMIC'/-; +set statement_timeout='9223372036854775807ns'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/-autocommit_dml_mode='PARTITIONED_NON_ATOMIC'; +set/-statement_timeout='9223372036854775807ns'; NEW_CONNECTION; -set autocommit_dml_mode='TRANSACTIONAL'; +set autocommit = false; +set transaction read only; NEW_CONNECTION; -SET AUTOCOMMIT_DML_MODE='TRANSACTIONAL'; +set autocommit = false; +SET TRANSACTION READ ONLY; NEW_CONNECTION; -set autocommit_dml_mode='transactional'; +set autocommit = false; +set transaction read only; NEW_CONNECTION; - set autocommit_dml_mode='TRANSACTIONAL'; +set autocommit = false; + set transaction read only; NEW_CONNECTION; - set autocommit_dml_mode='TRANSACTIONAL'; +set autocommit = false; + set transaction read only; NEW_CONNECTION; +set autocommit = false; -set autocommit_dml_mode='TRANSACTIONAL'; +set transaction read only; NEW_CONNECTION; -set autocommit_dml_mode='TRANSACTIONAL' ; +set autocommit = false; +set transaction read only ; NEW_CONNECTION; -set autocommit_dml_mode='TRANSACTIONAL' ; +set autocommit = false; +set transaction read only ; NEW_CONNECTION; -set autocommit_dml_mode='TRANSACTIONAL' +set autocommit = false; +set transaction read only ; NEW_CONNECTION; -set autocommit_dml_mode='TRANSACTIONAL'; +set autocommit = false; +set transaction read only; NEW_CONNECTION; -set autocommit_dml_mode='TRANSACTIONAL'; +set autocommit = false; +set transaction read only; NEW_CONNECTION; +set autocommit = false; set -autocommit_dml_mode='TRANSACTIONAL'; +transaction +read +only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set autocommit_dml_mode='TRANSACTIONAL'; +foo set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL' bar; +set transaction read only bar; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -%set autocommit_dml_mode='TRANSACTIONAL'; +%set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'%; +set transaction read only%; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set%autocommit_dml_mode='TRANSACTIONAL'; +set transaction read%only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -_set autocommit_dml_mode='TRANSACTIONAL'; +_set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'_; +set transaction read only_; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set_autocommit_dml_mode='TRANSACTIONAL'; +set transaction read_only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -&set autocommit_dml_mode='TRANSACTIONAL'; +&set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'&; +set transaction read only&; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set&autocommit_dml_mode='TRANSACTIONAL'; +set transaction read&only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -$set autocommit_dml_mode='TRANSACTIONAL'; +$set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'$; +set transaction read only$; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set$autocommit_dml_mode='TRANSACTIONAL'; +set transaction read$only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -@set autocommit_dml_mode='TRANSACTIONAL'; +@set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'@; +set transaction read only@; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set@autocommit_dml_mode='TRANSACTIONAL'; +set transaction read@only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -!set autocommit_dml_mode='TRANSACTIONAL'; +!set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'!; +set transaction read only!; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set!autocommit_dml_mode='TRANSACTIONAL'; +set transaction read!only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -*set autocommit_dml_mode='TRANSACTIONAL'; +*set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'*; +set transaction read only*; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set*autocommit_dml_mode='TRANSACTIONAL'; +set transaction read*only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -(set autocommit_dml_mode='TRANSACTIONAL'; +(set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'(; +set transaction read only(; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set(autocommit_dml_mode='TRANSACTIONAL'; +set transaction read(only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -)set autocommit_dml_mode='TRANSACTIONAL'; +)set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'); +set transaction read only); NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set)autocommit_dml_mode='TRANSACTIONAL'; +set transaction read)only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --set autocommit_dml_mode='TRANSACTIONAL'; +-set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'-; +set transaction read only-; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set-autocommit_dml_mode='TRANSACTIONAL'; +set transaction read-only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -+set autocommit_dml_mode='TRANSACTIONAL'; ++set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'+; +set transaction read only+; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set+autocommit_dml_mode='TRANSACTIONAL'; +set transaction read+only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --#set autocommit_dml_mode='TRANSACTIONAL'; +-#set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'-#; +set transaction read only-#; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set-#autocommit_dml_mode='TRANSACTIONAL'; +set transaction read-#only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/set autocommit_dml_mode='TRANSACTIONAL'; +/set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'/; +set transaction read only/; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set/autocommit_dml_mode='TRANSACTIONAL'; +set transaction read/only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -\set autocommit_dml_mode='TRANSACTIONAL'; +\set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'\; +set transaction read only\; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set\autocommit_dml_mode='TRANSACTIONAL'; +set transaction read\only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -?set autocommit_dml_mode='TRANSACTIONAL'; +?set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'?; +set transaction read only?; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set?autocommit_dml_mode='TRANSACTIONAL'; +set transaction read?only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --/set autocommit_dml_mode='TRANSACTIONAL'; +-/set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'-/; +set transaction read only-/; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set-/autocommit_dml_mode='TRANSACTIONAL'; +set transaction read-/only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set autocommit_dml_mode='TRANSACTIONAL'; +/#set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'/#; +set transaction read only/#; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set/#autocommit_dml_mode='TRANSACTIONAL'; +set transaction read/#only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set autocommit_dml_mode='TRANSACTIONAL'; +/-set transaction read only; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set autocommit_dml_mode='TRANSACTIONAL'/-; +set transaction read only/-; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set/-autocommit_dml_mode='TRANSACTIONAL'; +set transaction read/-only; NEW_CONNECTION; -set statement_timeout=null; +set autocommit = false; +set transaction read write; NEW_CONNECTION; -SET STATEMENT_TIMEOUT=NULL; +set autocommit = false; +SET TRANSACTION READ WRITE; NEW_CONNECTION; -set statement_timeout=null; +set autocommit = false; +set transaction read write; NEW_CONNECTION; - set statement_timeout=null; +set autocommit = false; + set transaction read write; NEW_CONNECTION; - set statement_timeout=null; +set autocommit = false; + set transaction read write; NEW_CONNECTION; +set autocommit = false; -set statement_timeout=null; +set transaction read write; NEW_CONNECTION; -set statement_timeout=null ; +set autocommit = false; +set transaction read write ; NEW_CONNECTION; -set statement_timeout=null ; +set autocommit = false; +set transaction read write ; NEW_CONNECTION; -set statement_timeout=null +set autocommit = false; +set transaction read write ; NEW_CONNECTION; -set statement_timeout=null; +set autocommit = false; +set transaction read write; NEW_CONNECTION; -set statement_timeout=null; +set autocommit = false; +set transaction read write; NEW_CONNECTION; +set autocommit = false; set -statement_timeout=null; +transaction +read +write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set statement_timeout=null; +foo set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null bar; +set transaction read write bar; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -%set statement_timeout=null; +%set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null%; +set transaction read write%; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set%statement_timeout=null; +set transaction read%write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -_set statement_timeout=null; +_set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null_; +set transaction read write_; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set_statement_timeout=null; +set transaction read_write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -&set statement_timeout=null; +&set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null&; +set transaction read write&; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set&statement_timeout=null; +set transaction read&write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -$set statement_timeout=null; +$set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null$; +set transaction read write$; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set$statement_timeout=null; +set transaction read$write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -@set statement_timeout=null; +@set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null@; +set transaction read write@; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set@statement_timeout=null; +set transaction read@write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -!set statement_timeout=null; +!set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null!; +set transaction read write!; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set!statement_timeout=null; +set transaction read!write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -*set statement_timeout=null; +*set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null*; +set transaction read write*; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set*statement_timeout=null; +set transaction read*write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -(set statement_timeout=null; +(set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null(; +set transaction read write(; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set(statement_timeout=null; +set transaction read(write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -)set statement_timeout=null; +)set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null); +set transaction read write); NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set)statement_timeout=null; +set transaction read)write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --set statement_timeout=null; +-set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null-; +set transaction read write-; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set-statement_timeout=null; +set transaction read-write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -+set statement_timeout=null; ++set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null+; +set transaction read write+; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set+statement_timeout=null; +set transaction read+write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --#set statement_timeout=null; +-#set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null-#; +set transaction read write-#; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set-#statement_timeout=null; +set transaction read-#write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/set statement_timeout=null; +/set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null/; +set transaction read write/; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set/statement_timeout=null; +set transaction read/write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -\set statement_timeout=null; +\set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null\; +set transaction read write\; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set\statement_timeout=null; +set transaction read\write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -?set statement_timeout=null; +?set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null?; +set transaction read write?; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set?statement_timeout=null; +set transaction read?write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --/set statement_timeout=null; +-/set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null-/; +set transaction read write-/; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set-/statement_timeout=null; +set transaction read-/write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set statement_timeout=null; +/#set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null/#; +set transaction read write/#; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set/#statement_timeout=null; +set transaction read/#write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set statement_timeout=null; +/-set transaction read write; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout=null/-; +set transaction read write/-; NEW_CONNECTION; +set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set/-statement_timeout=null; +set transaction read/-write; NEW_CONNECTION; -set statement_timeout='1s'; +set read_only_staleness='STRONG'; NEW_CONNECTION; -SET STATEMENT_TIMEOUT='1S'; +SET READ_ONLY_STALENESS='STRONG'; NEW_CONNECTION; -set statement_timeout='1s'; +set read_only_staleness='strong'; NEW_CONNECTION; - set statement_timeout='1s'; + set read_only_staleness='STRONG'; NEW_CONNECTION; - set statement_timeout='1s'; + set read_only_staleness='STRONG'; NEW_CONNECTION; -set statement_timeout='1s'; +set read_only_staleness='STRONG'; NEW_CONNECTION; -set statement_timeout='1s' ; +set read_only_staleness='STRONG' ; NEW_CONNECTION; -set statement_timeout='1s' ; +set read_only_staleness='STRONG' ; NEW_CONNECTION; -set statement_timeout='1s' +set read_only_staleness='STRONG' ; NEW_CONNECTION; -set statement_timeout='1s'; +set read_only_staleness='STRONG'; NEW_CONNECTION; -set statement_timeout='1s'; +set read_only_staleness='STRONG'; NEW_CONNECTION; set -statement_timeout='1s'; +read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set statement_timeout='1s'; +foo set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s' bar; +set read_only_staleness='STRONG' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set statement_timeout='1s'; +%set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'%; +set read_only_staleness='STRONG'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set%statement_timeout='1s'; +set%read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set statement_timeout='1s'; +_set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'_; +set read_only_staleness='STRONG'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set_statement_timeout='1s'; +set_read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set statement_timeout='1s'; +&set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'&; +set read_only_staleness='STRONG'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set&statement_timeout='1s'; +set&read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set statement_timeout='1s'; +$set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'$; +set read_only_staleness='STRONG'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set$statement_timeout='1s'; +set$read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set statement_timeout='1s'; +@set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'@; +set read_only_staleness='STRONG'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set@statement_timeout='1s'; +set@read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set statement_timeout='1s'; +!set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'!; +set read_only_staleness='STRONG'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set!statement_timeout='1s'; +set!read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set statement_timeout='1s'; +*set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'*; +set read_only_staleness='STRONG'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set*statement_timeout='1s'; +set*read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set statement_timeout='1s'; +(set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'(; +set read_only_staleness='STRONG'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set(statement_timeout='1s'; +set(read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set statement_timeout='1s'; +)set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'); +set read_only_staleness='STRONG'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set)statement_timeout='1s'; +set)read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set statement_timeout='1s'; +-set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'-; +set read_only_staleness='STRONG'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-statement_timeout='1s'; +set-read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set statement_timeout='1s'; ++set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'+; +set read_only_staleness='STRONG'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set+statement_timeout='1s'; +set+read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set statement_timeout='1s'; +-#set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'-#; +set read_only_staleness='STRONG'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-#statement_timeout='1s'; +set-#read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set statement_timeout='1s'; +/set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'/; +set read_only_staleness='STRONG'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/statement_timeout='1s'; +set/read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set statement_timeout='1s'; +\set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'\; +set read_only_staleness='STRONG'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set\statement_timeout='1s'; +set\read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set statement_timeout='1s'; +?set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'?; +set read_only_staleness='STRONG'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set?statement_timeout='1s'; +set?read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set statement_timeout='1s'; +-/set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'-/; +set read_only_staleness='STRONG'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-/statement_timeout='1s'; +set-/read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set statement_timeout='1s'; +/#set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'/#; +set read_only_staleness='STRONG'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/#statement_timeout='1s'; +set/#read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set statement_timeout='1s'; +/-set read_only_staleness='STRONG'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='1s'/-; +set read_only_staleness='STRONG'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/-statement_timeout='1s'; +set/-read_only_staleness='STRONG'; NEW_CONNECTION; -set statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; -SET STATEMENT_TIMEOUT='100MS'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; -set statement_timeout='100ms'; +set read_only_staleness='min_read_timestamp 2018-01-02t03:04:05.123-08:00'; NEW_CONNECTION; - set statement_timeout='100ms'; + set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; - set statement_timeout='100ms'; + set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; -set statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; -set statement_timeout='100ms' ; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00' ; NEW_CONNECTION; -set statement_timeout='100ms' ; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00' ; NEW_CONNECTION; -set statement_timeout='100ms' +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00' ; NEW_CONNECTION; -set statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; -set statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; set -statement_timeout='100ms'; +read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set statement_timeout='100ms'; +foo set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms' bar; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set statement_timeout='100ms'; +%set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'%; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set%statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP%2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set statement_timeout='100ms'; +_set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'_; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set_statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP_2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set statement_timeout='100ms'; +&set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'&; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set&statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP&2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set statement_timeout='100ms'; +$set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'$; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set$statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP$2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set statement_timeout='100ms'; +@set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'@; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set@statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP@2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set statement_timeout='100ms'; +!set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'!; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set!statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP!2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set statement_timeout='100ms'; +*set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'*; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set*statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP*2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set statement_timeout='100ms'; +(set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'(; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set(statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP(2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set statement_timeout='100ms'; +)set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'); +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set)statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP)2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set statement_timeout='100ms'; +-set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'-; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP-2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set statement_timeout='100ms'; ++set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'+; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set+statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP+2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set statement_timeout='100ms'; +-#set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'-#; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-#statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP-#2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set statement_timeout='100ms'; +/set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'/; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP/2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set statement_timeout='100ms'; +\set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'\; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set\statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP\2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set statement_timeout='100ms'; +?set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'?; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set?statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP?2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set statement_timeout='100ms'; +-/set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'-/; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-/statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP-/2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set statement_timeout='100ms'; +/#set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'/#; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/#statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP/#2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set statement_timeout='100ms'; +/-set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='100ms'/-; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/-statement_timeout='100ms'; +set read_only_staleness='MIN_READ_TIMESTAMP/-2018-01-02T03:04:05.123-08:00'; NEW_CONNECTION; -set statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; -SET STATEMENT_TIMEOUT='10000US'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; -set statement_timeout='10000us'; +set read_only_staleness='min_read_timestamp 2018-01-02t03:04:05.123z'; NEW_CONNECTION; - set statement_timeout='10000us'; + set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; - set statement_timeout='10000us'; + set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; -set statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; -set statement_timeout='10000us' ; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z' ; NEW_CONNECTION; -set statement_timeout='10000us' ; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z' ; NEW_CONNECTION; -set statement_timeout='10000us' +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z' ; NEW_CONNECTION; -set statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; -set statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; set -statement_timeout='10000us'; +read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set statement_timeout='10000us'; +foo set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us' bar; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set statement_timeout='10000us'; +%set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'%; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set%statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP%2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set statement_timeout='10000us'; +_set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'_; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set_statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP_2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set statement_timeout='10000us'; +&set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'&; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set&statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP&2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set statement_timeout='10000us'; +$set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'$; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set$statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP$2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set statement_timeout='10000us'; +@set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'@; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set@statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP@2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set statement_timeout='10000us'; +!set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'!; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set!statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP!2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set statement_timeout='10000us'; +*set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'*; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set*statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP*2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set statement_timeout='10000us'; +(set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'(; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set(statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP(2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set statement_timeout='10000us'; +)set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'); +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set)statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP)2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set statement_timeout='10000us'; +-set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'-; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP-2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set statement_timeout='10000us'; ++set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'+; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set+statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP+2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set statement_timeout='10000us'; +-#set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'-#; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-#statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP-#2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set statement_timeout='10000us'; +/set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'/; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP/2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set statement_timeout='10000us'; +\set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'\; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set\statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP\2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set statement_timeout='10000us'; +?set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'?; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set?statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP?2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set statement_timeout='10000us'; +-/set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'-/; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-/statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP-/2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set statement_timeout='10000us'; +/#set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'/#; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/#statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP/#2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set statement_timeout='10000us'; +/-set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='10000us'/-; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/-statement_timeout='10000us'; +set read_only_staleness='MIN_READ_TIMESTAMP/-2018-01-02T03:04:05.123Z'; NEW_CONNECTION; -set statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; -SET STATEMENT_TIMEOUT='9223372036854775807NS'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; -set statement_timeout='9223372036854775807ns'; +set read_only_staleness='min_read_timestamp 2018-01-02t03:04:05.123+07:45'; NEW_CONNECTION; - set statement_timeout='9223372036854775807ns'; + set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; - set statement_timeout='9223372036854775807ns'; + set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; -set statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; -set statement_timeout='9223372036854775807ns' ; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45' ; NEW_CONNECTION; -set statement_timeout='9223372036854775807ns' ; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45' ; NEW_CONNECTION; -set statement_timeout='9223372036854775807ns' +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45' ; NEW_CONNECTION; -set statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; -set statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; set -statement_timeout='9223372036854775807ns'; +read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set statement_timeout='9223372036854775807ns'; +foo set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns' bar; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set statement_timeout='9223372036854775807ns'; +%set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'%; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set%statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP%2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set statement_timeout='9223372036854775807ns'; +_set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'_; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set_statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP_2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set statement_timeout='9223372036854775807ns'; +&set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'&; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set&statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP&2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set statement_timeout='9223372036854775807ns'; +$set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'$; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set$statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP$2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set statement_timeout='9223372036854775807ns'; +@set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'@; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set@statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP@2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set statement_timeout='9223372036854775807ns'; +!set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'!; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set!statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP!2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set statement_timeout='9223372036854775807ns'; +*set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'*; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set*statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP*2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set statement_timeout='9223372036854775807ns'; +(set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'(; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set(statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP(2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set statement_timeout='9223372036854775807ns'; +)set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'); +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set)statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP)2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set statement_timeout='9223372036854775807ns'; +-set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'-; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP-2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set statement_timeout='9223372036854775807ns'; ++set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'+; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set+statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP+2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set statement_timeout='9223372036854775807ns'; +-#set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'-#; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-#statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP-#2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set statement_timeout='9223372036854775807ns'; +/set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'/; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP/2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set statement_timeout='9223372036854775807ns'; +\set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'\; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set\statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP\2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set statement_timeout='9223372036854775807ns'; +?set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'?; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set?statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP?2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set statement_timeout='9223372036854775807ns'; +-/set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'-/; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-/statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP-/2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set statement_timeout='9223372036854775807ns'; +/#set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'/#; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/#statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP/#2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set statement_timeout='9223372036854775807ns'; +/-set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set statement_timeout='9223372036854775807ns'/-; +set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/-statement_timeout='9223372036854775807ns'; +set read_only_staleness='MIN_READ_TIMESTAMP/-2018-01-02T03:04:05.123+07:45'; NEW_CONNECTION; -set autocommit = false; -set transaction read only; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; -SET TRANSACTION READ ONLY; +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; -set transaction read only; +set read_only_staleness='read_timestamp 2018-01-02t03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; - set transaction read only; + set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; - set transaction read only; + set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; -set transaction read only; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; -set transaction read only ; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00' ; NEW_CONNECTION; -set autocommit = false; -set transaction read only ; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00' ; NEW_CONNECTION; -set autocommit = false; -set transaction read only +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00' ; NEW_CONNECTION; -set autocommit = false; -set transaction read only; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; -set transaction read only; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; set -transaction -read -only; +read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set transaction read only; +foo set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only bar; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00' bar; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -%set transaction read only; +%set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only%; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'%; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read%only; +set read_only_staleness='READ_TIMESTAMP%2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -_set transaction read only; +_set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only_; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'_; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read_only; +set read_only_staleness='READ_TIMESTAMP_2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -&set transaction read only; +&set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only&; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'&; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read&only; +set read_only_staleness='READ_TIMESTAMP&2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -$set transaction read only; +$set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only$; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'$; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read$only; +set read_only_staleness='READ_TIMESTAMP$2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -@set transaction read only; +@set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only@; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'@; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read@only; +set read_only_staleness='READ_TIMESTAMP@2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -!set transaction read only; +!set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only!; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'!; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read!only; +set read_only_staleness='READ_TIMESTAMP!2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -*set transaction read only; +*set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only*; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'*; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read*only; +set read_only_staleness='READ_TIMESTAMP*2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -(set transaction read only; +(set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only(; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'(; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read(only; +set read_only_staleness='READ_TIMESTAMP(2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -)set transaction read only; +)set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only); +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'); NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read)only; +set read_only_staleness='READ_TIMESTAMP)2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --set transaction read only; +-set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only-; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'-; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read-only; +set read_only_staleness='READ_TIMESTAMP-2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -+set transaction read only; ++set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only+; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'+; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read+only; +set read_only_staleness='READ_TIMESTAMP+2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --#set transaction read only; +-#set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only-#; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'-#; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read-#only; +set read_only_staleness='READ_TIMESTAMP-#2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/set transaction read only; +/set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only/; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'/; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read/only; +set read_only_staleness='READ_TIMESTAMP/2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -\set transaction read only; +\set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only\; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'\; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read\only; +set read_only_staleness='READ_TIMESTAMP\2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -?set transaction read only; +?set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only?; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'?; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read?only; +set read_only_staleness='READ_TIMESTAMP?2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --/set transaction read only; +-/set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only-/; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'-/; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read-/only; +set read_only_staleness='READ_TIMESTAMP-/2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set transaction read only; +/#set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only/#; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'/#; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read/#only; +set read_only_staleness='READ_TIMESTAMP/#2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set transaction read only; +/-set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read only/-; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'/-; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read/-only; +set read_only_staleness='READ_TIMESTAMP/-2018-01-02T03:04:05.54321-07:00'; NEW_CONNECTION; -set autocommit = false; -set transaction read write; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; -SET TRANSACTION READ WRITE; +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; -set transaction read write; +set read_only_staleness='read_timestamp 2018-01-02t03:04:05.54321z'; NEW_CONNECTION; -set autocommit = false; - set transaction read write; + set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; - set transaction read write; + set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; -set transaction read write; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; -set transaction read write ; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z' ; NEW_CONNECTION; -set autocommit = false; -set transaction read write ; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z' ; NEW_CONNECTION; -set autocommit = false; -set transaction read write +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z' ; NEW_CONNECTION; -set autocommit = false; -set transaction read write; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; -set transaction read write; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; set -transaction -read -write; +read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set transaction read write; +foo set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write bar; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z' bar; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -%set transaction read write; +%set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write%; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'%; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read%write; +set read_only_staleness='READ_TIMESTAMP%2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -_set transaction read write; +_set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write_; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'_; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read_write; +set read_only_staleness='READ_TIMESTAMP_2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -&set transaction read write; +&set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write&; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'&; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read&write; +set read_only_staleness='READ_TIMESTAMP&2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -$set transaction read write; +$set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write$; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'$; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read$write; +set read_only_staleness='READ_TIMESTAMP$2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -@set transaction read write; +@set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write@; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'@; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read@write; +set read_only_staleness='READ_TIMESTAMP@2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -!set transaction read write; +!set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write!; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'!; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read!write; +set read_only_staleness='READ_TIMESTAMP!2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -*set transaction read write; +*set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write*; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'*; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read*write; +set read_only_staleness='READ_TIMESTAMP*2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -(set transaction read write; +(set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write(; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'(; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read(write; +set read_only_staleness='READ_TIMESTAMP(2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -)set transaction read write; +)set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write); +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'); NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read)write; +set read_only_staleness='READ_TIMESTAMP)2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --set transaction read write; +-set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write-; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'-; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read-write; +set read_only_staleness='READ_TIMESTAMP-2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -+set transaction read write; ++set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write+; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'+; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read+write; +set read_only_staleness='READ_TIMESTAMP+2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --#set transaction read write; +-#set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write-#; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'-#; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read-#write; +set read_only_staleness='READ_TIMESTAMP-#2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/set transaction read write; +/set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write/; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'/; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read/write; +set read_only_staleness='READ_TIMESTAMP/2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -\set transaction read write; +\set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write\; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'\; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read\write; +set read_only_staleness='READ_TIMESTAMP\2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -?set transaction read write; +?set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write?; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'?; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read?write; +set read_only_staleness='READ_TIMESTAMP?2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT --/set transaction read write; +-/set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write-/; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'-/; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read-/write; +set read_only_staleness='READ_TIMESTAMP-/2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set transaction read write; +/#set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write/#; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'/#; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read/#write; +set read_only_staleness='READ_TIMESTAMP/#2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set transaction read write; +/-set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read write/-; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'/-; NEW_CONNECTION; -set autocommit = false; @EXPECT EXCEPTION INVALID_ARGUMENT -set transaction read/-write; +set read_only_staleness='READ_TIMESTAMP/-2018-01-02T03:04:05.54321Z'; NEW_CONNECTION; -set read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; -SET READ_ONLY_STALENESS='STRONG'; +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; -set read_only_staleness='strong'; +set read_only_staleness='read_timestamp 2018-01-02t03:04:05.54321+05:30'; NEW_CONNECTION; - set read_only_staleness='STRONG'; + set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; - set read_only_staleness='STRONG'; + set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; -set read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; -set read_only_staleness='STRONG' ; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30' ; NEW_CONNECTION; -set read_only_staleness='STRONG' ; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30' ; NEW_CONNECTION; -set read_only_staleness='STRONG' +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30' ; NEW_CONNECTION; -set read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; -set read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; set -read_only_staleness='STRONG'; +read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='STRONG'; +foo set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG' bar; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='STRONG'; +%set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'%; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set%read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP%2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='STRONG'; +_set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'_; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set_read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP_2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='STRONG'; +&set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'&; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set&read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP&2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='STRONG'; +$set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'$; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set$read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP$2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='STRONG'; +@set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'@; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set@read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP@2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='STRONG'; +!set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'!; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set!read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP!2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='STRONG'; +*set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'*; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set*read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP*2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='STRONG'; +(set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'(; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set(read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP(2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='STRONG'; +)set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'); +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set)read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP)2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='STRONG'; +-set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'-; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP-2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='STRONG'; ++set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'+; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set+read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP+2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='STRONG'; +-#set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'-#; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-#read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP-#2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='STRONG'; +/set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'/; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP/2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='STRONG'; +\set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'\; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set\read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP\2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='STRONG'; +?set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'?; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set?read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP?2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='STRONG'; +-/set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'-/; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set-/read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP-/2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='STRONG'; +/#set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'/#; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/#read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP/#2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='STRONG'; +/-set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='STRONG'/-; +set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set/-read_only_staleness='STRONG'; +set read_only_staleness='READ_TIMESTAMP/-2018-01-02T03:04:05.54321+05:30'; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +SET READ_ONLY_STALENESS='MAX_STALENESS 12S'; NEW_CONNECTION; -set read_only_staleness='min_read_timestamp 2018-01-02t03:04:05.123-08:00'; +set read_only_staleness='max_staleness 12s'; NEW_CONNECTION; - set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; + set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; - set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; + set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00' ; +set read_only_staleness='MAX_STALENESS 12s' ; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00' ; +set read_only_staleness='MAX_STALENESS 12s' ; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00' +set read_only_staleness='MAX_STALENESS 12s' ; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; set -read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +foo set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00' bar; +set read_only_staleness='MAX_STALENESS 12s' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +%set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'%; +set read_only_staleness='MAX_STALENESS 12s'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP%2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS%12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +_set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'_; +set read_only_staleness='MAX_STALENESS 12s'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP_2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS_12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +&set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'&; +set read_only_staleness='MAX_STALENESS 12s'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP&2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS&12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +$set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'$; +set read_only_staleness='MAX_STALENESS 12s'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP$2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS$12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +@set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'@; +set read_only_staleness='MAX_STALENESS 12s'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP@2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS@12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +!set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'!; +set read_only_staleness='MAX_STALENESS 12s'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP!2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS!12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +*set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'*; +set read_only_staleness='MAX_STALENESS 12s'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP*2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS*12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +(set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'(; +set read_only_staleness='MAX_STALENESS 12s'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP(2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS(12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +)set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'); +set read_only_staleness='MAX_STALENESS 12s'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP)2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS)12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +-set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'-; +set read_only_staleness='MAX_STALENESS 12s'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP-2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS-12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; ++set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'+; +set read_only_staleness='MAX_STALENESS 12s'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP+2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS+12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +-#set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'-#; +set read_only_staleness='MAX_STALENESS 12s'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP-#2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS-#12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +/set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'/; +set read_only_staleness='MAX_STALENESS 12s'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP/2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS/12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +\set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'\; +set read_only_staleness='MAX_STALENESS 12s'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP\2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS\12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +?set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'?; +set read_only_staleness='MAX_STALENESS 12s'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP?2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS?12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +-/set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'-/; +set read_only_staleness='MAX_STALENESS 12s'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP-/2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS-/12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +/#set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'/#; +set read_only_staleness='MAX_STALENESS 12s'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP/#2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS/#12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'; +/-set read_only_staleness='MAX_STALENESS 12s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123-08:00'/-; +set read_only_staleness='MAX_STALENESS 12s'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP/-2018-01-02T03:04:05.123-08:00'; +set read_only_staleness='MAX_STALENESS/-12s'; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +SET READ_ONLY_STALENESS='MAX_STALENESS 100MS'; NEW_CONNECTION; -set read_only_staleness='min_read_timestamp 2018-01-02t03:04:05.123z'; +set read_only_staleness='max_staleness 100ms'; NEW_CONNECTION; - set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; + set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; - set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; + set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z' ; +set read_only_staleness='MAX_STALENESS 100ms' ; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z' ; +set read_only_staleness='MAX_STALENESS 100ms' ; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z' +set read_only_staleness='MAX_STALENESS 100ms' ; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; set -read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +foo set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z' bar; +set read_only_staleness='MAX_STALENESS 100ms' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +%set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'%; +set read_only_staleness='MAX_STALENESS 100ms'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP%2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS%100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +_set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'_; +set read_only_staleness='MAX_STALENESS 100ms'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP_2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS_100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +&set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'&; +set read_only_staleness='MAX_STALENESS 100ms'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP&2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS&100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +$set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'$; +set read_only_staleness='MAX_STALENESS 100ms'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP$2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS$100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +@set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'@; +set read_only_staleness='MAX_STALENESS 100ms'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP@2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS@100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +!set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'!; +set read_only_staleness='MAX_STALENESS 100ms'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP!2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS!100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +*set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'*; +set read_only_staleness='MAX_STALENESS 100ms'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP*2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS*100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +(set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'(; +set read_only_staleness='MAX_STALENESS 100ms'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP(2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS(100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +)set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'); +set read_only_staleness='MAX_STALENESS 100ms'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP)2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS)100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +-set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'-; +set read_only_staleness='MAX_STALENESS 100ms'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP-2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS-100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; ++set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'+; +set read_only_staleness='MAX_STALENESS 100ms'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP+2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS+100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +-#set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'-#; +set read_only_staleness='MAX_STALENESS 100ms'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP-#2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS-#100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +/set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'/; +set read_only_staleness='MAX_STALENESS 100ms'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP/2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS/100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +\set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'\; +set read_only_staleness='MAX_STALENESS 100ms'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP\2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS\100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +?set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'?; +set read_only_staleness='MAX_STALENESS 100ms'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP?2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS?100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +-/set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'-/; +set read_only_staleness='MAX_STALENESS 100ms'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP-/2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS-/100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +/#set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'/#; +set read_only_staleness='MAX_STALENESS 100ms'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP/#2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS/#100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'; +/-set read_only_staleness='MAX_STALENESS 100ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123Z'/-; +set read_only_staleness='MAX_STALENESS 100ms'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP/-2018-01-02T03:04:05.123Z'; +set read_only_staleness='MAX_STALENESS/-100ms'; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +SET READ_ONLY_STALENESS='MAX_STALENESS 99999US'; NEW_CONNECTION; -set read_only_staleness='min_read_timestamp 2018-01-02t03:04:05.123+07:45'; +set read_only_staleness='max_staleness 99999us'; NEW_CONNECTION; - set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; + set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; - set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; + set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45' ; +set read_only_staleness='MAX_STALENESS 99999us' ; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45' ; +set read_only_staleness='MAX_STALENESS 99999us' ; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45' +set read_only_staleness='MAX_STALENESS 99999us' ; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; set -read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +foo set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45' bar; +set read_only_staleness='MAX_STALENESS 99999us' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +%set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'%; +set read_only_staleness='MAX_STALENESS 99999us'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP%2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS%99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +_set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'_; +set read_only_staleness='MAX_STALENESS 99999us'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP_2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS_99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +&set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'&; +set read_only_staleness='MAX_STALENESS 99999us'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP&2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS&99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +$set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'$; +set read_only_staleness='MAX_STALENESS 99999us'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP$2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS$99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +@set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'@; +set read_only_staleness='MAX_STALENESS 99999us'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP@2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS@99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +!set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'!; +set read_only_staleness='MAX_STALENESS 99999us'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP!2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS!99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +*set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'*; +set read_only_staleness='MAX_STALENESS 99999us'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP*2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS*99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +(set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'(; +set read_only_staleness='MAX_STALENESS 99999us'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP(2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS(99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +)set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'); +set read_only_staleness='MAX_STALENESS 99999us'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP)2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS)99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +-set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'-; +set read_only_staleness='MAX_STALENESS 99999us'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP-2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS-99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; ++set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'+; +set read_only_staleness='MAX_STALENESS 99999us'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP+2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS+99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +-#set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'-#; +set read_only_staleness='MAX_STALENESS 99999us'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP-#2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS-#99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +/set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'/; +set read_only_staleness='MAX_STALENESS 99999us'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP/2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS/99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +\set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'\; +set read_only_staleness='MAX_STALENESS 99999us'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP\2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS\99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +?set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'?; +set read_only_staleness='MAX_STALENESS 99999us'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP?2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS?99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +-/set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'-/; +set read_only_staleness='MAX_STALENESS 99999us'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP-/2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS-/99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +/#set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'/#; +set read_only_staleness='MAX_STALENESS 99999us'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP/#2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS/#99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'; +/-set read_only_staleness='MAX_STALENESS 99999us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP 2018-01-02T03:04:05.123+07:45'/-; +set read_only_staleness='MAX_STALENESS 99999us'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MIN_READ_TIMESTAMP/-2018-01-02T03:04:05.123+07:45'; +set read_only_staleness='MAX_STALENESS/-99999us'; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +SET READ_ONLY_STALENESS='MAX_STALENESS 10NS'; NEW_CONNECTION; -set read_only_staleness='read_timestamp 2018-01-02t03:04:05.54321-07:00'; +set read_only_staleness='max_staleness 10ns'; NEW_CONNECTION; - set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; + set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; - set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; + set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00' ; +set read_only_staleness='MAX_STALENESS 10ns' ; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00' ; +set read_only_staleness='MAX_STALENESS 10ns' ; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00' +set read_only_staleness='MAX_STALENESS 10ns' ; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; set -read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +foo set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00' bar; +set read_only_staleness='MAX_STALENESS 10ns' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +%set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'%; +set read_only_staleness='MAX_STALENESS 10ns'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP%2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS%10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +_set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'_; +set read_only_staleness='MAX_STALENESS 10ns'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP_2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS_10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +&set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'&; +set read_only_staleness='MAX_STALENESS 10ns'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP&2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS&10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +$set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'$; +set read_only_staleness='MAX_STALENESS 10ns'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP$2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS$10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +@set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'@; +set read_only_staleness='MAX_STALENESS 10ns'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP@2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS@10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +!set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'!; +set read_only_staleness='MAX_STALENESS 10ns'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP!2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS!10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +*set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'*; +set read_only_staleness='MAX_STALENESS 10ns'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP*2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS*10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +(set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'(; +set read_only_staleness='MAX_STALENESS 10ns'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP(2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS(10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +)set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'); +set read_only_staleness='MAX_STALENESS 10ns'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP)2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS)10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +-set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'-; +set read_only_staleness='MAX_STALENESS 10ns'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP-2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS-10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; ++set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'+; +set read_only_staleness='MAX_STALENESS 10ns'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP+2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS+10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +-#set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'-#; +set read_only_staleness='MAX_STALENESS 10ns'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP-#2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS-#10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +/set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'/; +set read_only_staleness='MAX_STALENESS 10ns'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP/2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS/10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +\set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'\; +set read_only_staleness='MAX_STALENESS 10ns'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP\2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS\10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +?set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'?; +set read_only_staleness='MAX_STALENESS 10ns'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP?2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS?10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +-/set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'-/; +set read_only_staleness='MAX_STALENESS 10ns'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP-/2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS-/10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +/#set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'/#; +set read_only_staleness='MAX_STALENESS 10ns'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP/#2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS/#10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'; +/-set read_only_staleness='MAX_STALENESS 10ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321-07:00'/-; +set read_only_staleness='MAX_STALENESS 10ns'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP/-2018-01-02T03:04:05.54321-07:00'; +set read_only_staleness='MAX_STALENESS/-10ns'; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +SET READ_ONLY_STALENESS='EXACT_STALENESS 15S'; NEW_CONNECTION; -set read_only_staleness='read_timestamp 2018-01-02t03:04:05.54321z'; +set read_only_staleness='exact_staleness 15s'; NEW_CONNECTION; - set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; + set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; - set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; + set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z' ; +set read_only_staleness='EXACT_STALENESS 15s' ; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z' ; +set read_only_staleness='EXACT_STALENESS 15s' ; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z' +set read_only_staleness='EXACT_STALENESS 15s' ; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; set -read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +foo set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z' bar; +set read_only_staleness='EXACT_STALENESS 15s' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +%set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'%; +set read_only_staleness='EXACT_STALENESS 15s'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP%2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS%15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +_set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'_; +set read_only_staleness='EXACT_STALENESS 15s'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP_2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS_15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +&set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'&; +set read_only_staleness='EXACT_STALENESS 15s'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP&2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS&15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +$set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'$; +set read_only_staleness='EXACT_STALENESS 15s'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP$2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS$15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +@set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'@; +set read_only_staleness='EXACT_STALENESS 15s'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP@2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS@15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +!set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'!; +set read_only_staleness='EXACT_STALENESS 15s'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP!2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS!15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +*set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'*; +set read_only_staleness='EXACT_STALENESS 15s'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP*2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS*15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +(set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'(; +set read_only_staleness='EXACT_STALENESS 15s'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP(2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS(15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +)set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'); +set read_only_staleness='EXACT_STALENESS 15s'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP)2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS)15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +-set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'-; +set read_only_staleness='EXACT_STALENESS 15s'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP-2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS-15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; ++set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'+; +set read_only_staleness='EXACT_STALENESS 15s'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP+2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS+15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +-#set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'-#; +set read_only_staleness='EXACT_STALENESS 15s'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP-#2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS-#15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +/set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'/; +set read_only_staleness='EXACT_STALENESS 15s'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP/2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS/15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +\set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'\; +set read_only_staleness='EXACT_STALENESS 15s'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP\2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS\15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +?set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'?; +set read_only_staleness='EXACT_STALENESS 15s'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP?2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS?15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +-/set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'-/; +set read_only_staleness='EXACT_STALENESS 15s'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP-/2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS-/15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +/#set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'/#; +set read_only_staleness='EXACT_STALENESS 15s'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP/#2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS/#15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'; +/-set read_only_staleness='EXACT_STALENESS 15s'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321Z'/-; +set read_only_staleness='EXACT_STALENESS 15s'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP/-2018-01-02T03:04:05.54321Z'; +set read_only_staleness='EXACT_STALENESS/-15s'; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +SET READ_ONLY_STALENESS='EXACT_STALENESS 1500MS'; NEW_CONNECTION; -set read_only_staleness='read_timestamp 2018-01-02t03:04:05.54321+05:30'; +set read_only_staleness='exact_staleness 1500ms'; NEW_CONNECTION; - set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; + set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; - set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; + set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30' ; +set read_only_staleness='EXACT_STALENESS 1500ms' ; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30' ; +set read_only_staleness='EXACT_STALENESS 1500ms' ; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30' +set read_only_staleness='EXACT_STALENESS 1500ms' ; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; set -read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +foo set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30' bar; +set read_only_staleness='EXACT_STALENESS 1500ms' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +%set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'%; +set read_only_staleness='EXACT_STALENESS 1500ms'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP%2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS%1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +_set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'_; +set read_only_staleness='EXACT_STALENESS 1500ms'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP_2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS_1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +&set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'&; +set read_only_staleness='EXACT_STALENESS 1500ms'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP&2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS&1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +$set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'$; +set read_only_staleness='EXACT_STALENESS 1500ms'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP$2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS$1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +@set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'@; +set read_only_staleness='EXACT_STALENESS 1500ms'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP@2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS@1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +!set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'!; +set read_only_staleness='EXACT_STALENESS 1500ms'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP!2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS!1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +*set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'*; +set read_only_staleness='EXACT_STALENESS 1500ms'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP*2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS*1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +(set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'(; +set read_only_staleness='EXACT_STALENESS 1500ms'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP(2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS(1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +)set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'); +set read_only_staleness='EXACT_STALENESS 1500ms'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP)2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS)1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +-set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'-; +set read_only_staleness='EXACT_STALENESS 1500ms'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP-2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS-1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; ++set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'+; +set read_only_staleness='EXACT_STALENESS 1500ms'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP+2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS+1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +-#set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'-#; +set read_only_staleness='EXACT_STALENESS 1500ms'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP-#2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS-#1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +/set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'/; +set read_only_staleness='EXACT_STALENESS 1500ms'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP/2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS/1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +\set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'\; +set read_only_staleness='EXACT_STALENESS 1500ms'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP\2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS\1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +?set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'?; +set read_only_staleness='EXACT_STALENESS 1500ms'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP?2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS?1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +-/set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'-/; +set read_only_staleness='EXACT_STALENESS 1500ms'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP-/2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS-/1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +/#set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'/#; +set read_only_staleness='EXACT_STALENESS 1500ms'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP/#2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS/#1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'; +/-set read_only_staleness='EXACT_STALENESS 1500ms'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP 2018-01-02T03:04:05.54321+05:30'/-; +set read_only_staleness='EXACT_STALENESS 1500ms'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='READ_TIMESTAMP/-2018-01-02T03:04:05.54321+05:30'; +set read_only_staleness='EXACT_STALENESS/-1500ms'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 12s'; +set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; -SET READ_ONLY_STALENESS='MAX_STALENESS 12S'; +SET READ_ONLY_STALENESS='EXACT_STALENESS 15000000US'; NEW_CONNECTION; -set read_only_staleness='max_staleness 12s'; +set read_only_staleness='exact_staleness 15000000us'; NEW_CONNECTION; - set read_only_staleness='MAX_STALENESS 12s'; + set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; - set read_only_staleness='MAX_STALENESS 12s'; + set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 12s'; +set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 12s' ; +set read_only_staleness='EXACT_STALENESS 15000000us' ; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 12s' ; +set read_only_staleness='EXACT_STALENESS 15000000us' ; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 12s' +set read_only_staleness='EXACT_STALENESS 15000000us' ; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 12s'; +set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 12s'; +set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; set -read_only_staleness='MAX_STALENESS 12s'; +read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='MAX_STALENESS 12s'; +foo set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s' bar; +set read_only_staleness='EXACT_STALENESS 15000000us' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='MAX_STALENESS 12s'; +%set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'%; +set read_only_staleness='EXACT_STALENESS 15000000us'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS%12s'; +set read_only_staleness='EXACT_STALENESS%15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='MAX_STALENESS 12s'; +_set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'_; +set read_only_staleness='EXACT_STALENESS 15000000us'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS_12s'; +set read_only_staleness='EXACT_STALENESS_15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='MAX_STALENESS 12s'; +&set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'&; +set read_only_staleness='EXACT_STALENESS 15000000us'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS&12s'; +set read_only_staleness='EXACT_STALENESS&15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='MAX_STALENESS 12s'; +$set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'$; +set read_only_staleness='EXACT_STALENESS 15000000us'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS$12s'; +set read_only_staleness='EXACT_STALENESS$15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='MAX_STALENESS 12s'; +@set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'@; +set read_only_staleness='EXACT_STALENESS 15000000us'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS@12s'; +set read_only_staleness='EXACT_STALENESS@15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='MAX_STALENESS 12s'; +!set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'!; +set read_only_staleness='EXACT_STALENESS 15000000us'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS!12s'; +set read_only_staleness='EXACT_STALENESS!15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='MAX_STALENESS 12s'; +*set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'*; +set read_only_staleness='EXACT_STALENESS 15000000us'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS*12s'; +set read_only_staleness='EXACT_STALENESS*15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='MAX_STALENESS 12s'; +(set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'(; +set read_only_staleness='EXACT_STALENESS 15000000us'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS(12s'; +set read_only_staleness='EXACT_STALENESS(15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='MAX_STALENESS 12s'; +)set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'); +set read_only_staleness='EXACT_STALENESS 15000000us'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS)12s'; +set read_only_staleness='EXACT_STALENESS)15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='MAX_STALENESS 12s'; +-set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'-; +set read_only_staleness='EXACT_STALENESS 15000000us'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS-12s'; +set read_only_staleness='EXACT_STALENESS-15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='MAX_STALENESS 12s'; ++set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'+; +set read_only_staleness='EXACT_STALENESS 15000000us'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS+12s'; +set read_only_staleness='EXACT_STALENESS+15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='MAX_STALENESS 12s'; +-#set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'-#; +set read_only_staleness='EXACT_STALENESS 15000000us'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS-#12s'; +set read_only_staleness='EXACT_STALENESS-#15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='MAX_STALENESS 12s'; +/set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'/; +set read_only_staleness='EXACT_STALENESS 15000000us'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS/12s'; +set read_only_staleness='EXACT_STALENESS/15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='MAX_STALENESS 12s'; +\set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'\; +set read_only_staleness='EXACT_STALENESS 15000000us'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS\12s'; +set read_only_staleness='EXACT_STALENESS\15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='MAX_STALENESS 12s'; +?set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'?; +set read_only_staleness='EXACT_STALENESS 15000000us'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS?12s'; +set read_only_staleness='EXACT_STALENESS?15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='MAX_STALENESS 12s'; +-/set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'-/; +set read_only_staleness='EXACT_STALENESS 15000000us'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS-/12s'; +set read_only_staleness='EXACT_STALENESS-/15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='MAX_STALENESS 12s'; +/#set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'/#; +set read_only_staleness='EXACT_STALENESS 15000000us'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS/#12s'; +set read_only_staleness='EXACT_STALENESS/#15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='MAX_STALENESS 12s'; +/-set read_only_staleness='EXACT_STALENESS 15000000us'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 12s'/-; +set read_only_staleness='EXACT_STALENESS 15000000us'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS/-12s'; +set read_only_staleness='EXACT_STALENESS/-15000000us'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 100ms'; +set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; -SET READ_ONLY_STALENESS='MAX_STALENESS 100MS'; +SET READ_ONLY_STALENESS='EXACT_STALENESS 9999NS'; NEW_CONNECTION; -set read_only_staleness='max_staleness 100ms'; +set read_only_staleness='exact_staleness 9999ns'; NEW_CONNECTION; - set read_only_staleness='MAX_STALENESS 100ms'; + set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; - set read_only_staleness='MAX_STALENESS 100ms'; + set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 100ms'; +set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 100ms' ; +set read_only_staleness='EXACT_STALENESS 9999ns' ; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 100ms' ; +set read_only_staleness='EXACT_STALENESS 9999ns' ; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 100ms' +set read_only_staleness='EXACT_STALENESS 9999ns' ; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 100ms'; +set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 100ms'; +set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; set -read_only_staleness='MAX_STALENESS 100ms'; +read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='MAX_STALENESS 100ms'; +foo set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms' bar; +set read_only_staleness='EXACT_STALENESS 9999ns' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='MAX_STALENESS 100ms'; +%set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'%; +set read_only_staleness='EXACT_STALENESS 9999ns'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS%100ms'; +set read_only_staleness='EXACT_STALENESS%9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='MAX_STALENESS 100ms'; +_set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'_; +set read_only_staleness='EXACT_STALENESS 9999ns'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS_100ms'; +set read_only_staleness='EXACT_STALENESS_9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='MAX_STALENESS 100ms'; +&set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'&; +set read_only_staleness='EXACT_STALENESS 9999ns'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS&100ms'; +set read_only_staleness='EXACT_STALENESS&9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='MAX_STALENESS 100ms'; +$set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'$; +set read_only_staleness='EXACT_STALENESS 9999ns'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS$100ms'; +set read_only_staleness='EXACT_STALENESS$9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='MAX_STALENESS 100ms'; +@set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'@; +set read_only_staleness='EXACT_STALENESS 9999ns'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS@100ms'; +set read_only_staleness='EXACT_STALENESS@9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='MAX_STALENESS 100ms'; +!set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'!; +set read_only_staleness='EXACT_STALENESS 9999ns'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS!100ms'; +set read_only_staleness='EXACT_STALENESS!9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='MAX_STALENESS 100ms'; +*set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'*; +set read_only_staleness='EXACT_STALENESS 9999ns'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS*100ms'; +set read_only_staleness='EXACT_STALENESS*9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='MAX_STALENESS 100ms'; +(set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'(; +set read_only_staleness='EXACT_STALENESS 9999ns'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS(100ms'; +set read_only_staleness='EXACT_STALENESS(9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='MAX_STALENESS 100ms'; +)set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'); +set read_only_staleness='EXACT_STALENESS 9999ns'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS)100ms'; +set read_only_staleness='EXACT_STALENESS)9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='MAX_STALENESS 100ms'; +-set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'-; +set read_only_staleness='EXACT_STALENESS 9999ns'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS-100ms'; +set read_only_staleness='EXACT_STALENESS-9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='MAX_STALENESS 100ms'; ++set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'+; +set read_only_staleness='EXACT_STALENESS 9999ns'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS+100ms'; +set read_only_staleness='EXACT_STALENESS+9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='MAX_STALENESS 100ms'; +-#set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'-#; +set read_only_staleness='EXACT_STALENESS 9999ns'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS-#100ms'; +set read_only_staleness='EXACT_STALENESS-#9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='MAX_STALENESS 100ms'; +/set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'/; +set read_only_staleness='EXACT_STALENESS 9999ns'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS/100ms'; +set read_only_staleness='EXACT_STALENESS/9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='MAX_STALENESS 100ms'; +\set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'\; +set read_only_staleness='EXACT_STALENESS 9999ns'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS\100ms'; +set read_only_staleness='EXACT_STALENESS\9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='MAX_STALENESS 100ms'; +?set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'?; +set read_only_staleness='EXACT_STALENESS 9999ns'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS?100ms'; +set read_only_staleness='EXACT_STALENESS?9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='MAX_STALENESS 100ms'; +-/set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'-/; +set read_only_staleness='EXACT_STALENESS 9999ns'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS-/100ms'; +set read_only_staleness='EXACT_STALENESS-/9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='MAX_STALENESS 100ms'; +/#set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'/#; +set read_only_staleness='EXACT_STALENESS 9999ns'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS/#100ms'; +set read_only_staleness='EXACT_STALENESS/#9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='MAX_STALENESS 100ms'; +/-set read_only_staleness='EXACT_STALENESS 9999ns'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 100ms'/-; +set read_only_staleness='EXACT_STALENESS 9999ns'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS/-100ms'; +set read_only_staleness='EXACT_STALENESS/-9999ns'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 99999us'; +set optimizer_version='1'; NEW_CONNECTION; -SET READ_ONLY_STALENESS='MAX_STALENESS 99999US'; +SET OPTIMIZER_VERSION='1'; NEW_CONNECTION; -set read_only_staleness='max_staleness 99999us'; +set optimizer_version='1'; NEW_CONNECTION; - set read_only_staleness='MAX_STALENESS 99999us'; + set optimizer_version='1'; NEW_CONNECTION; - set read_only_staleness='MAX_STALENESS 99999us'; + set optimizer_version='1'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 99999us'; +set optimizer_version='1'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 99999us' ; +set optimizer_version='1' ; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 99999us' ; +set optimizer_version='1' ; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 99999us' +set optimizer_version='1' ; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 99999us'; +set optimizer_version='1'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 99999us'; +set optimizer_version='1'; NEW_CONNECTION; set -read_only_staleness='MAX_STALENESS 99999us'; +optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='MAX_STALENESS 99999us'; +foo set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us' bar; +set optimizer_version='1' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='MAX_STALENESS 99999us'; +%set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'%; +set optimizer_version='1'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS%99999us'; +set%optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='MAX_STALENESS 99999us'; +_set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'_; +set optimizer_version='1'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS_99999us'; +set_optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='MAX_STALENESS 99999us'; +&set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'&; +set optimizer_version='1'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS&99999us'; +set&optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='MAX_STALENESS 99999us'; +$set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'$; +set optimizer_version='1'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS$99999us'; +set$optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='MAX_STALENESS 99999us'; +@set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'@; +set optimizer_version='1'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS@99999us'; +set@optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='MAX_STALENESS 99999us'; +!set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'!; +set optimizer_version='1'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS!99999us'; +set!optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='MAX_STALENESS 99999us'; +*set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'*; +set optimizer_version='1'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS*99999us'; +set*optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='MAX_STALENESS 99999us'; +(set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'(; +set optimizer_version='1'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS(99999us'; +set(optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='MAX_STALENESS 99999us'; +)set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'); +set optimizer_version='1'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS)99999us'; +set)optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='MAX_STALENESS 99999us'; +-set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'-; +set optimizer_version='1'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS-99999us'; +set-optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='MAX_STALENESS 99999us'; ++set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'+; +set optimizer_version='1'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS+99999us'; +set+optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='MAX_STALENESS 99999us'; +-#set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'-#; +set optimizer_version='1'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS-#99999us'; +set-#optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='MAX_STALENESS 99999us'; +/set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'/; +set optimizer_version='1'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS/99999us'; +set/optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='MAX_STALENESS 99999us'; +\set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'\; +set optimizer_version='1'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS\99999us'; +set\optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='MAX_STALENESS 99999us'; +?set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'?; +set optimizer_version='1'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS?99999us'; +set?optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='MAX_STALENESS 99999us'; +-/set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'-/; +set optimizer_version='1'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS-/99999us'; +set-/optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='MAX_STALENESS 99999us'; +/#set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'/#; +set optimizer_version='1'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS/#99999us'; +set/#optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='MAX_STALENESS 99999us'; +/-set optimizer_version='1'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 99999us'/-; +set optimizer_version='1'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS/-99999us'; +set/-optimizer_version='1'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 10ns'; +set optimizer_version='200'; NEW_CONNECTION; -SET READ_ONLY_STALENESS='MAX_STALENESS 10NS'; +SET OPTIMIZER_VERSION='200'; NEW_CONNECTION; -set read_only_staleness='max_staleness 10ns'; +set optimizer_version='200'; NEW_CONNECTION; - set read_only_staleness='MAX_STALENESS 10ns'; + set optimizer_version='200'; NEW_CONNECTION; - set read_only_staleness='MAX_STALENESS 10ns'; + set optimizer_version='200'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 10ns'; +set optimizer_version='200'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 10ns' ; +set optimizer_version='200' ; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 10ns' ; +set optimizer_version='200' ; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 10ns' +set optimizer_version='200' ; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 10ns'; +set optimizer_version='200'; NEW_CONNECTION; -set read_only_staleness='MAX_STALENESS 10ns'; +set optimizer_version='200'; NEW_CONNECTION; set -read_only_staleness='MAX_STALENESS 10ns'; +optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='MAX_STALENESS 10ns'; +foo set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns' bar; +set optimizer_version='200' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='MAX_STALENESS 10ns'; +%set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'%; +set optimizer_version='200'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS%10ns'; +set%optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='MAX_STALENESS 10ns'; +_set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'_; +set optimizer_version='200'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS_10ns'; +set_optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='MAX_STALENESS 10ns'; +&set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'&; +set optimizer_version='200'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS&10ns'; +set&optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='MAX_STALENESS 10ns'; +$set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'$; +set optimizer_version='200'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS$10ns'; +set$optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='MAX_STALENESS 10ns'; +@set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'@; +set optimizer_version='200'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS@10ns'; +set@optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='MAX_STALENESS 10ns'; +!set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'!; +set optimizer_version='200'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS!10ns'; +set!optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='MAX_STALENESS 10ns'; +*set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'*; +set optimizer_version='200'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS*10ns'; +set*optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='MAX_STALENESS 10ns'; +(set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'(; +set optimizer_version='200'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS(10ns'; +set(optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='MAX_STALENESS 10ns'; +)set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'); +set optimizer_version='200'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS)10ns'; +set)optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='MAX_STALENESS 10ns'; +-set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'-; +set optimizer_version='200'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS-10ns'; +set-optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='MAX_STALENESS 10ns'; ++set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'+; +set optimizer_version='200'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS+10ns'; +set+optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='MAX_STALENESS 10ns'; +-#set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'-#; +set optimizer_version='200'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS-#10ns'; +set-#optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='MAX_STALENESS 10ns'; +/set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'/; +set optimizer_version='200'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS/10ns'; +set/optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='MAX_STALENESS 10ns'; +\set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'\; +set optimizer_version='200'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS\10ns'; +set\optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='MAX_STALENESS 10ns'; +?set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'?; +set optimizer_version='200'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS?10ns'; +set?optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='MAX_STALENESS 10ns'; +-/set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'-/; +set optimizer_version='200'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS-/10ns'; +set-/optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='MAX_STALENESS 10ns'; +/#set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'/#; +set optimizer_version='200'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS/#10ns'; +set/#optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='MAX_STALENESS 10ns'; +/-set optimizer_version='200'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS 10ns'/-; +set optimizer_version='200'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='MAX_STALENESS/-10ns'; +set/-optimizer_version='200'; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15s'; +set optimizer_version='LATEST'; NEW_CONNECTION; -SET READ_ONLY_STALENESS='EXACT_STALENESS 15S'; +SET OPTIMIZER_VERSION='LATEST'; NEW_CONNECTION; -set read_only_staleness='exact_staleness 15s'; +set optimizer_version='latest'; NEW_CONNECTION; - set read_only_staleness='EXACT_STALENESS 15s'; + set optimizer_version='LATEST'; NEW_CONNECTION; - set read_only_staleness='EXACT_STALENESS 15s'; + set optimizer_version='LATEST'; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15s'; +set optimizer_version='LATEST'; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15s' ; +set optimizer_version='LATEST' ; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15s' ; +set optimizer_version='LATEST' ; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15s' +set optimizer_version='LATEST' ; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15s'; +set optimizer_version='LATEST'; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15s'; +set optimizer_version='LATEST'; NEW_CONNECTION; set -read_only_staleness='EXACT_STALENESS 15s'; +optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='EXACT_STALENESS 15s'; +foo set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s' bar; +set optimizer_version='LATEST' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='EXACT_STALENESS 15s'; +%set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'%; +set optimizer_version='LATEST'%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS%15s'; +set%optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='EXACT_STALENESS 15s'; +_set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'_; +set optimizer_version='LATEST'_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS_15s'; +set_optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='EXACT_STALENESS 15s'; +&set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'&; +set optimizer_version='LATEST'&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS&15s'; +set&optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='EXACT_STALENESS 15s'; +$set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'$; +set optimizer_version='LATEST'$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS$15s'; +set$optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='EXACT_STALENESS 15s'; +@set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'@; +set optimizer_version='LATEST'@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS@15s'; +set@optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='EXACT_STALENESS 15s'; +!set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'!; +set optimizer_version='LATEST'!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS!15s'; +set!optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='EXACT_STALENESS 15s'; +*set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'*; +set optimizer_version='LATEST'*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS*15s'; +set*optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='EXACT_STALENESS 15s'; +(set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'(; +set optimizer_version='LATEST'(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS(15s'; +set(optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='EXACT_STALENESS 15s'; +)set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'); +set optimizer_version='LATEST'); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS)15s'; +set)optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='EXACT_STALENESS 15s'; +-set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'-; +set optimizer_version='LATEST'-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS-15s'; +set-optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='EXACT_STALENESS 15s'; ++set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'+; +set optimizer_version='LATEST'+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS+15s'; +set+optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='EXACT_STALENESS 15s'; +-#set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'-#; +set optimizer_version='LATEST'-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS-#15s'; +set-#optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='EXACT_STALENESS 15s'; +/set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'/; +set optimizer_version='LATEST'/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS/15s'; +set/optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='EXACT_STALENESS 15s'; +\set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'\; +set optimizer_version='LATEST'\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS\15s'; +set\optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='EXACT_STALENESS 15s'; +?set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'?; +set optimizer_version='LATEST'?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS?15s'; +set?optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='EXACT_STALENESS 15s'; +-/set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'-/; +set optimizer_version='LATEST'-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS-/15s'; +set-/optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='EXACT_STALENESS 15s'; +/#set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'/#; +set optimizer_version='LATEST'/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS/#15s'; +set/#optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='EXACT_STALENESS 15s'; +/-set optimizer_version='LATEST'; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15s'/-; +set optimizer_version='LATEST'/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS/-15s'; +set/-optimizer_version='LATEST'; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 1500ms'; +set optimizer_version=''; NEW_CONNECTION; -SET READ_ONLY_STALENESS='EXACT_STALENESS 1500MS'; +SET OPTIMIZER_VERSION=''; NEW_CONNECTION; -set read_only_staleness='exact_staleness 1500ms'; +set optimizer_version=''; NEW_CONNECTION; - set read_only_staleness='EXACT_STALENESS 1500ms'; + set optimizer_version=''; NEW_CONNECTION; - set read_only_staleness='EXACT_STALENESS 1500ms'; + set optimizer_version=''; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 1500ms'; +set optimizer_version=''; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 1500ms' ; +set optimizer_version='' ; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 1500ms' ; +set optimizer_version='' ; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 1500ms' +set optimizer_version='' ; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 1500ms'; +set optimizer_version=''; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 1500ms'; +set optimizer_version=''; NEW_CONNECTION; set -read_only_staleness='EXACT_STALENESS 1500ms'; +optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='EXACT_STALENESS 1500ms'; +foo set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms' bar; +set optimizer_version='' bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='EXACT_STALENESS 1500ms'; +%set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'%; +set optimizer_version=''%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS%1500ms'; +set%optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='EXACT_STALENESS 1500ms'; +_set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'_; +set optimizer_version=''_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS_1500ms'; +set_optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='EXACT_STALENESS 1500ms'; +&set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'&; +set optimizer_version=''&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS&1500ms'; +set&optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='EXACT_STALENESS 1500ms'; +$set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'$; +set optimizer_version=''$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS$1500ms'; +set$optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='EXACT_STALENESS 1500ms'; +@set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'@; +set optimizer_version=''@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS@1500ms'; +set@optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='EXACT_STALENESS 1500ms'; +!set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'!; +set optimizer_version=''!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS!1500ms'; +set!optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='EXACT_STALENESS 1500ms'; +*set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'*; +set optimizer_version=''*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS*1500ms'; +set*optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='EXACT_STALENESS 1500ms'; +(set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'(; +set optimizer_version=''(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS(1500ms'; +set(optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='EXACT_STALENESS 1500ms'; +)set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'); +set optimizer_version=''); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS)1500ms'; +set)optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='EXACT_STALENESS 1500ms'; +-set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'-; +set optimizer_version=''-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS-1500ms'; +set-optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='EXACT_STALENESS 1500ms'; ++set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'+; +set optimizer_version=''+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS+1500ms'; +set+optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='EXACT_STALENESS 1500ms'; +-#set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'-#; +set optimizer_version=''-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS-#1500ms'; +set-#optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='EXACT_STALENESS 1500ms'; +/set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'/; +set optimizer_version=''/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS/1500ms'; +set/optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='EXACT_STALENESS 1500ms'; +\set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'\; +set optimizer_version=''\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS\1500ms'; +set\optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='EXACT_STALENESS 1500ms'; +?set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'?; +set optimizer_version=''?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS?1500ms'; +set?optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='EXACT_STALENESS 1500ms'; +-/set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'-/; +set optimizer_version=''-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS-/1500ms'; +set-/optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='EXACT_STALENESS 1500ms'; +/#set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'/#; +set optimizer_version=''/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS/#1500ms'; +set/#optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='EXACT_STALENESS 1500ms'; +/-set optimizer_version=''; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 1500ms'/-; +set optimizer_version=''/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS/-1500ms'; +set/-optimizer_version=''; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15000000us'; +set return_commit_stats = true; NEW_CONNECTION; -SET READ_ONLY_STALENESS='EXACT_STALENESS 15000000US'; +SET RETURN_COMMIT_STATS = TRUE; NEW_CONNECTION; -set read_only_staleness='exact_staleness 15000000us'; +set return_commit_stats = true; NEW_CONNECTION; - set read_only_staleness='EXACT_STALENESS 15000000us'; + set return_commit_stats = true; NEW_CONNECTION; - set read_only_staleness='EXACT_STALENESS 15000000us'; + set return_commit_stats = true; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15000000us'; +set return_commit_stats = true; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15000000us' ; +set return_commit_stats = true ; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15000000us' ; +set return_commit_stats = true ; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15000000us' +set return_commit_stats = true ; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15000000us'; +set return_commit_stats = true; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 15000000us'; +set return_commit_stats = true; NEW_CONNECTION; set -read_only_staleness='EXACT_STALENESS 15000000us'; +return_commit_stats += +true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='EXACT_STALENESS 15000000us'; +foo set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us' bar; +set return_commit_stats = true bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='EXACT_STALENESS 15000000us'; +%set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'%; +set return_commit_stats = true%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS%15000000us'; +set return_commit_stats =%true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='EXACT_STALENESS 15000000us'; +_set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'_; +set return_commit_stats = true_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS_15000000us'; +set return_commit_stats =_true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='EXACT_STALENESS 15000000us'; +&set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'&; +set return_commit_stats = true&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS&15000000us'; +set return_commit_stats =&true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='EXACT_STALENESS 15000000us'; +$set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'$; +set return_commit_stats = true$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS$15000000us'; +set return_commit_stats =$true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='EXACT_STALENESS 15000000us'; +@set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'@; +set return_commit_stats = true@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS@15000000us'; +set return_commit_stats =@true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='EXACT_STALENESS 15000000us'; +!set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'!; +set return_commit_stats = true!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS!15000000us'; +set return_commit_stats =!true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='EXACT_STALENESS 15000000us'; +*set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'*; +set return_commit_stats = true*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS*15000000us'; +set return_commit_stats =*true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='EXACT_STALENESS 15000000us'; +(set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'(; +set return_commit_stats = true(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS(15000000us'; +set return_commit_stats =(true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='EXACT_STALENESS 15000000us'; +)set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'); +set return_commit_stats = true); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS)15000000us'; +set return_commit_stats =)true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='EXACT_STALENESS 15000000us'; +-set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'-; +set return_commit_stats = true-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS-15000000us'; +set return_commit_stats =-true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='EXACT_STALENESS 15000000us'; ++set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'+; +set return_commit_stats = true+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS+15000000us'; +set return_commit_stats =+true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='EXACT_STALENESS 15000000us'; +-#set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'-#; +set return_commit_stats = true-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS-#15000000us'; +set return_commit_stats =-#true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='EXACT_STALENESS 15000000us'; +/set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'/; +set return_commit_stats = true/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS/15000000us'; +set return_commit_stats =/true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='EXACT_STALENESS 15000000us'; +\set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'\; +set return_commit_stats = true\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS\15000000us'; +set return_commit_stats =\true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='EXACT_STALENESS 15000000us'; +?set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'?; +set return_commit_stats = true?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS?15000000us'; +set return_commit_stats =?true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='EXACT_STALENESS 15000000us'; +-/set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'-/; +set return_commit_stats = true-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS-/15000000us'; +set return_commit_stats =-/true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='EXACT_STALENESS 15000000us'; +/#set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'/#; +set return_commit_stats = true/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS/#15000000us'; +set return_commit_stats =/#true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='EXACT_STALENESS 15000000us'; +/-set return_commit_stats = true; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 15000000us'/-; +set return_commit_stats = true/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS/-15000000us'; +set return_commit_stats =/-true; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 9999ns'; +set return_commit_stats = false; NEW_CONNECTION; -SET READ_ONLY_STALENESS='EXACT_STALENESS 9999NS'; +SET RETURN_COMMIT_STATS = FALSE; NEW_CONNECTION; -set read_only_staleness='exact_staleness 9999ns'; +set return_commit_stats = false; NEW_CONNECTION; - set read_only_staleness='EXACT_STALENESS 9999ns'; + set return_commit_stats = false; NEW_CONNECTION; - set read_only_staleness='EXACT_STALENESS 9999ns'; + set return_commit_stats = false; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 9999ns'; +set return_commit_stats = false; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 9999ns' ; +set return_commit_stats = false ; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 9999ns' ; +set return_commit_stats = false ; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 9999ns' +set return_commit_stats = false ; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 9999ns'; +set return_commit_stats = false; NEW_CONNECTION; -set read_only_staleness='EXACT_STALENESS 9999ns'; +set return_commit_stats = false; NEW_CONNECTION; set -read_only_staleness='EXACT_STALENESS 9999ns'; +return_commit_stats += +false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -foo set read_only_staleness='EXACT_STALENESS 9999ns'; +foo set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns' bar; +set return_commit_stats = false bar; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -%set read_only_staleness='EXACT_STALENESS 9999ns'; +%set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'%; +set return_commit_stats = false%; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS%9999ns'; +set return_commit_stats =%false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -_set read_only_staleness='EXACT_STALENESS 9999ns'; +_set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'_; +set return_commit_stats = false_; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS_9999ns'; +set return_commit_stats =_false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -&set read_only_staleness='EXACT_STALENESS 9999ns'; +&set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'&; +set return_commit_stats = false&; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS&9999ns'; +set return_commit_stats =&false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -$set read_only_staleness='EXACT_STALENESS 9999ns'; +$set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'$; +set return_commit_stats = false$; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS$9999ns'; +set return_commit_stats =$false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -@set read_only_staleness='EXACT_STALENESS 9999ns'; +@set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'@; +set return_commit_stats = false@; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS@9999ns'; +set return_commit_stats =@false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -!set read_only_staleness='EXACT_STALENESS 9999ns'; +!set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'!; +set return_commit_stats = false!; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS!9999ns'; +set return_commit_stats =!false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -*set read_only_staleness='EXACT_STALENESS 9999ns'; +*set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'*; +set return_commit_stats = false*; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS*9999ns'; +set return_commit_stats =*false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -(set read_only_staleness='EXACT_STALENESS 9999ns'; +(set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'(; +set return_commit_stats = false(; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS(9999ns'; +set return_commit_stats =(false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -)set read_only_staleness='EXACT_STALENESS 9999ns'; +)set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'); +set return_commit_stats = false); NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS)9999ns'; +set return_commit_stats =)false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --set read_only_staleness='EXACT_STALENESS 9999ns'; +-set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'-; +set return_commit_stats = false-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS-9999ns'; +set return_commit_stats =-false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -+set read_only_staleness='EXACT_STALENESS 9999ns'; ++set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'+; +set return_commit_stats = false+; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS+9999ns'; +set return_commit_stats =+false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --#set read_only_staleness='EXACT_STALENESS 9999ns'; +-#set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'-#; +set return_commit_stats = false-#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS-#9999ns'; +set return_commit_stats =-#false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/set read_only_staleness='EXACT_STALENESS 9999ns'; +/set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'/; +set return_commit_stats = false/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS/9999ns'; +set return_commit_stats =/false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -\set read_only_staleness='EXACT_STALENESS 9999ns'; +\set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'\; +set return_commit_stats = false\; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS\9999ns'; +set return_commit_stats =\false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -?set read_only_staleness='EXACT_STALENESS 9999ns'; +?set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'?; +set return_commit_stats = false?; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS?9999ns'; +set return_commit_stats =?false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT --/set read_only_staleness='EXACT_STALENESS 9999ns'; +-/set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'-/; +set return_commit_stats = false-/; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS-/9999ns'; +set return_commit_stats =-/false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/#set read_only_staleness='EXACT_STALENESS 9999ns'; +/#set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'/#; +set return_commit_stats = false/#; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS/#9999ns'; +set return_commit_stats =/#false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -/-set read_only_staleness='EXACT_STALENESS 9999ns'; +/-set return_commit_stats = false; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS 9999ns'/-; +set return_commit_stats = false/-; NEW_CONNECTION; @EXPECT EXCEPTION INVALID_ARGUMENT -set read_only_staleness='EXACT_STALENESS/-9999ns'; +set return_commit_stats =/-false; 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 c7650856164..b56c2b89061 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 @@ -2,6 +2,16 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -142,15 +152,15 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:54.904000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:54.904000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:39.999000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:39.999000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:54.904000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:39.999000000Z'; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; @@ -179,6 +189,26 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; @@ -272,6 +302,16 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +SELECT 1 AS TEST; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -422,15 +462,15 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; SELECT 1 AS TEST; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:54.986000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:54.986000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:40.104000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:40.104000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; SELECT 1 AS TEST; -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:54.986000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2019-07-31T10:46:54.986000000Z' +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:40.104000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2020-11-06T18:52:40.104000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; @@ -461,6 +501,26 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; SELECT 1 AS TEST; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +SELECT 1 AS TEST; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; @@ -561,6 +621,16 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +SELECT 1 AS TEST; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -711,15 +781,15 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; SELECT 1 AS TEST; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.049000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.049000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:40.202000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:40.202000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; SELECT 1 AS TEST; -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.049000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2019-07-31T10:46:55.049000000Z' +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:40.202000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2020-11-06T18:52:40.202000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; @@ -750,6 +820,26 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; SELECT 1 AS TEST; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +SELECT 1 AS TEST; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; @@ -850,6 +940,16 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; SET READ_ONLY_STALENESS='MAX_STALENESS 10s'; +NEW_CONNECTION; +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=TRUE; +SET AUTOCOMMIT=TRUE; +SET READ_ONLY_STALENESS='MAX_STALENESS 10s'; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -1000,15 +1100,15 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; SET READ_ONLY_STALENESS='MAX_STALENESS 10s'; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.100000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.100000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:40.272000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:40.272000000Z' 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 2019-07-31T10:46:55.100000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2019-07-31T10:46:55.100000000Z' +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:40.272000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2020-11-06T18:52:40.272000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; @@ -1039,6 +1139,26 @@ NEW_CONNECTION; 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; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +SET READ_ONLY_STALENESS='MAX_STALENESS 10s'; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +SET READ_ONLY_STALENESS='MAX_STALENESS 10s'; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; @@ -1141,6 +1261,20 @@ SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; SELECT 1 AS TEST; COMMIT; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; +SELECT 1 AS TEST; +COMMIT; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; +SELECT 1 AS TEST; +COMMIT; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -1345,8 +1479,8 @@ SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; SELECT 1 AS TEST; COMMIT; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.147000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.147000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:40.494000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:40.494000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; @@ -1354,8 +1488,8 @@ SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; SELECT 1 AS TEST; COMMIT; -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.147000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2019-07-31T10:46:55.147000000Z' +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:40.494000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2020-11-06T18:52:40.494000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; @@ -1396,6 +1530,30 @@ SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; SELECT 1 AS TEST; COMMIT; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; +SELECT 1 AS TEST; +COMMIT; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; +SELECT 1 AS TEST; +COMMIT; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; @@ -1515,6 +1673,14 @@ COMMIT; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -1638,14 +1804,14 @@ SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.196000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.196000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:40.575000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:40.575000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.196000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2019-07-31T10:46:55.196000000Z' +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:40.575000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2020-11-06T18:52:40.575000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; @@ -1671,6 +1837,24 @@ SET AUTOCOMMIT=TRUE; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=TRUE; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=TRUE; @@ -1762,6 +1946,18 @@ 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; @@ -1928,8 +2124,8 @@ SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; SET TRANSACTION READ ONLY; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.237000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.237000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:40.623000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:40.623000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; @@ -1937,7 +2133,7 @@ SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; SET TRANSACTION READ ONLY; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.237000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:40.623000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @@ -1971,6 +2167,28 @@ 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; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +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; @@ -2074,6 +2292,16 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -2218,15 +2446,15 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.284000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.284000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:40.740000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:40.740000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.284000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:40.740000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @@ -2255,6 +2483,26 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @@ -2348,6 +2596,16 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; 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); +@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); @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -2512,15 +2770,15 @@ 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 2019-07-31T10:46:55.377000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.377000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:40.836000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:40.836000000Z' 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='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.377000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2019-07-31T10:46:55.377000000Z' +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:40.836000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2020-11-06T18:52:40.836000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; @@ -2551,6 +2809,26 @@ NEW_CONNECTION; SET READONLY=FALSE; 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' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@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); +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id); NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @@ -2651,6 +2929,18 @@ SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @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; +@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; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -2842,16 +3132,16 @@ SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.430000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.430000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:40.908000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:40.908000000Z' 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 2019-07-31T10:46:55.430000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2019-07-31T10:46:55.430000000Z' +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:40.908000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2020-11-06T18:52:40.908000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; @@ -2887,6 +3177,28 @@ SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@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; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @@ -2996,6 +3308,16 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +SELECT 1 AS TEST; +@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 ABORT BATCH; NEW_CONNECTION; @@ -3160,15 +3482,15 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; SELECT 1 AS TEST; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.491000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.491000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:40.966000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:40.966000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; SELECT 1 AS TEST; -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.491000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2019-07-31T10:46:55.491000000Z' +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:40.966000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2020-11-06T18:52:40.966000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; @@ -3199,6 +3521,26 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; SELECT 1 AS TEST; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +SELECT 1 AS TEST; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @@ -3298,6 +3640,16 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; START BATCH DDL; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +START BATCH DDL; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +START BATCH DDL; ABORT BATCH; NEW_CONNECTION; SET READONLY=FALSE; @@ -3439,13 +3791,13 @@ SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; START BATCH DDL; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.524000000Z'; +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.009000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; START BATCH DDL; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.524000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.009000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @@ -3472,6 +3824,26 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; START BATCH DDL; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +START BATCH DDL; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +START BATCH DDL; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @@ -3567,6 +3939,20 @@ SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; UPDATE foo SET bar=1; COMMIT; +NEW_CONNECTION; +SET READONLY=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=TRUE; +BEGIN TRANSACTION; +UPDATE foo SET bar=1; +COMMIT; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -3785,8 +4171,8 @@ SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; UPDATE foo SET bar=1; COMMIT; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.594000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.594000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.060000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.060000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; @@ -3794,8 +4180,8 @@ SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; UPDATE foo SET bar=1; COMMIT; -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.594000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2019-07-31T10:46:55.594000000Z' +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.060000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2020-11-06T18:52:41.060000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; @@ -3836,6 +4222,30 @@ SET AUTOCOMMIT=TRUE; BEGIN TRANSACTION; UPDATE foo SET bar=1; COMMIT; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; +UPDATE foo SET bar=1; +COMMIT; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +BEGIN TRANSACTION; +UPDATE foo SET bar=1; +COMMIT; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @@ -3955,6 +4365,16 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; UPDATE foo SET bar=1; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +UPDATE foo SET bar=1; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +UPDATE foo SET bar=1; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -4119,15 +4539,15 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; UPDATE foo SET bar=1; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.650000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.650000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.132000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.132000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; UPDATE foo SET bar=1; -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.650000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2019-07-31T10:46:55.650000000Z' +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.132000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2020-11-06T18:52:41.132000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; @@ -4158,6 +4578,26 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; UPDATE foo SET bar=1; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +UPDATE foo SET bar=1; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +UPDATE foo SET bar=1; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @@ -4256,6 +4696,14 @@ UPDATE foo SET bar=1; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -4393,14 +4841,14 @@ SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.687000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.687000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.178000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.178000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.687000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2019-07-31T10:46:55.687000000Z' +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.178000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','MIN_READ_TIMESTAMP 2020-11-06T18:52:41.178000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; @@ -4426,6 +4874,24 @@ SET AUTOCOMMIT=TRUE; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=TRUE; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=TRUE; @@ -4515,6 +4981,16 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; BEGIN TRANSACTION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -4659,15 +5135,15 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; BEGIN TRANSACTION; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.716000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.716000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.209000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.209000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; BEGIN TRANSACTION; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.716000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.209000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -4696,6 +5172,26 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; BEGIN TRANSACTION; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -4792,6 +5288,22 @@ SET TRANSACTION READ ONLY; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; COMMIT; +NEW_CONNECTION; +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=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; @@ -5031,8 +5543,8 @@ SET TRANSACTION READ ONLY; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; COMMIT; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.754000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.754000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.254000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.254000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; @@ -5042,7 +5554,7 @@ SET TRANSACTION READ ONLY; SELECT 1 AS TEST; COMMIT; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.754000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.254000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -5086,6 +5598,32 @@ 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; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +SET TRANSACTION READ ONLY; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +COMMIT; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +SET TRANSACTION READ ONLY; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +COMMIT; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -5214,6 +5752,16 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; COMMIT; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +COMMIT; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +COMMIT; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -5372,15 +5920,15 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; COMMIT; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.806000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.806000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.287000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.287000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; COMMIT; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.806000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.287000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -5409,6 +5957,26 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; COMMIT; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +COMMIT; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +COMMIT; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -5509,6 +6077,20 @@ SET AUTOCOMMIT=FALSE; 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; +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=FALSE; +SET AUTOCOMMIT=FALSE; +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; @@ -5721,8 +6303,8 @@ 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 2019-07-31T10:46:55.836000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.836000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.323000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.323000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; @@ -5731,7 +6313,7 @@ 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 2019-07-31T10:46:55.836000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.323000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -5770,6 +6352,30 @@ SET AUTOCOMMIT=FALSE; 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; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@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; +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; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -5891,6 +6497,22 @@ BEGIN TRANSACTION; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; ROLLBACK; +NEW_CONNECTION; +SET READONLY=FALSE; +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=FALSE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +ROLLBACK; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -6130,8 +6752,8 @@ BEGIN TRANSACTION; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; ROLLBACK; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.874000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.874000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.379000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.379000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; @@ -6141,7 +6763,7 @@ BEGIN TRANSACTION; SELECT 1 AS TEST; ROLLBACK; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.874000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.379000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -6185,6 +6807,32 @@ 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; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +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; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +ROLLBACK; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -6314,6 +6962,18 @@ SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=FALSE; +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=FALSE; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -6487,14 +7147,14 @@ SET AUTOCOMMIT=FALSE; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.915000000Z'; +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.431000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.915000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.431000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -6526,6 +7186,28 @@ SET READONLY=FALSE; 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; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +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 +SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -6629,6 +7311,16 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +SELECT 1 AS TEST; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -6775,13 +7467,13 @@ SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.970000000Z'; +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.485000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:55.970000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.485000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -6808,6 +7500,26 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; SELECT 1 AS TEST; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +SELECT 1 AS TEST; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -6901,6 +7613,16 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; SET READ_ONLY_STALENESS='EXACT_STALENESS 10s'; +NEW_CONNECTION; +SET READONLY=FALSE; +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=FALSE; +SET READ_ONLY_STALENESS='EXACT_STALENESS 10s'; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -7059,15 +7781,15 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; SET READ_ONLY_STALENESS='EXACT_STALENESS 10s'; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:55.995000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:55.995000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.537000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.537000000Z' 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 2019-07-31T10:46:55.995000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.537000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -7096,6 +7818,26 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; SET READ_ONLY_STALENESS='EXACT_STALENESS 10s'; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +SET READ_ONLY_STALENESS='EXACT_STALENESS 10s'; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +SET READ_ONLY_STALENESS='EXACT_STALENESS 10s'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -7194,6 +7936,16 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; SET TRANSACTION READ ONLY; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +SET TRANSACTION READ ONLY; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +SET TRANSACTION READ ONLY; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -7333,15 +8085,15 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; SET TRANSACTION READ ONLY; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:56.013000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:56.013000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.561000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.561000000Z' 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 2019-07-31T10:46:56.013000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.561000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -7370,6 +8122,26 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; SET TRANSACTION READ ONLY; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +SET TRANSACTION READ ONLY; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +SET TRANSACTION READ ONLY; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -7463,6 +8235,16 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; START BATCH DDL; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +START BATCH DDL; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +START BATCH DDL; ABORT BATCH; NEW_CONNECTION; SET READONLY=FALSE; @@ -7604,13 +8386,13 @@ SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; START BATCH DDL; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:56.029000000Z'; +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.592000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; START BATCH DDL; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:56.029000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.592000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -7637,6 +8419,26 @@ NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; START BATCH DDL; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +START BATCH DDL; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +START BATCH DDL; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -7733,6 +8535,22 @@ BEGIN TRANSACTION; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; COMMIT; +NEW_CONNECTION; +SET READONLY=FALSE; +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=FALSE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +COMMIT; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -7972,8 +8790,8 @@ BEGIN TRANSACTION; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; COMMIT; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:56.066000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:56.066000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.648000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.648000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; @@ -7983,7 +8801,7 @@ BEGIN TRANSACTION; SELECT 1 AS TEST; COMMIT; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:56.066000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.648000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -8027,6 +8845,32 @@ 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; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +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; +COMMIT; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +COMMIT; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -8156,6 +9000,18 @@ SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; START BATCH DDL; 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); +@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); ABORT BATCH; NEW_CONNECTION; SET READONLY=FALSE; @@ -8324,14 +9180,14 @@ SET AUTOCOMMIT=FALSE; 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 2019-07-31T10:46:56.104000000Z'; +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.697000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; 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 2019-07-31T10:46:56.104000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.697000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -8363,6 +9219,28 @@ SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; 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; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@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); +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +START BATCH DDL; +CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id); NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -8465,6 +9343,14 @@ CREATE TABLE foo (id INT64 NOT NULL, name STRING(100)) PRIMARY KEY (id); NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -8596,14 +9482,14 @@ SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:56.132000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:56.132000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.734000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.734000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:56.132000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.734000000Z'; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -8627,6 +9513,24 @@ SET AUTOCOMMIT=FALSE; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; +NEW_CONNECTION; +SET READONLY=FALSE; +SET AUTOCOMMIT=FALSE; NEW_CONNECTION; SET READONLY=FALSE; SET AUTOCOMMIT=FALSE; @@ -8715,6 +9619,16 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; BEGIN TRANSACTION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -8855,15 +9769,15 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; BEGIN TRANSACTION; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:56.157000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:56.157000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.758000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.758000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; BEGIN TRANSACTION; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:56.157000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.758000000Z'; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -8892,6 +9806,26 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; BEGIN TRANSACTION; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -8985,6 +9919,16 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; COMMIT; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +COMMIT; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +COMMIT; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -9133,15 +10077,15 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; COMMIT; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:56.175000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:56.175000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.790000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.790000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; COMMIT; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:56.175000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.790000000Z'; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -9170,6 +10114,26 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; COMMIT; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +COMMIT; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +COMMIT; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -9272,6 +10236,22 @@ BEGIN TRANSACTION; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; ROLLBACK; +NEW_CONNECTION; +SET READONLY=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=FALSE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +ROLLBACK; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -9501,8 +10481,8 @@ BEGIN TRANSACTION; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; ROLLBACK; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:56.203000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:56.203000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.834000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.834000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; @@ -9512,7 +10492,7 @@ BEGIN TRANSACTION; SELECT 1 AS TEST; ROLLBACK; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:56.203000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.834000000Z'; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -9556,6 +10536,32 @@ 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; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +ROLLBACK; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +ROLLBACK; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -9686,6 +10692,18 @@ SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=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=FALSE; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -9854,14 +10872,14 @@ SET AUTOCOMMIT=FALSE; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:56.262000000Z'; +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.873000000Z'; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:56.262000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.873000000Z'; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -9893,6 +10911,28 @@ SET READONLY=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; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -9996,6 +11036,16 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +SELECT 1 AS TEST; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -10137,13 +11187,13 @@ SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:56.291000000Z'; +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.911000000Z'; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; SELECT 1 AS TEST; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:56.291000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.911000000Z'; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -10170,6 +11220,26 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; SELECT 1 AS TEST; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +SELECT 1 AS TEST; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +SELECT 1 AS TEST; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -10263,6 +11333,16 @@ 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; @@ -10411,15 +11491,15 @@ NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; SET READ_ONLY_STALENESS='EXACT_STALENESS 10s'; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:56.311000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:56.311000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.936000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.936000000Z' 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 2019-07-31T10:46:56.311000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.936000000Z'; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -10448,6 +11528,26 @@ 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; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +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; @@ -10550,6 +11650,22 @@ BEGIN TRANSACTION; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; COMMIT; +NEW_CONNECTION; +SET READONLY=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=FALSE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +COMMIT; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -10779,8 +11895,8 @@ BEGIN TRANSACTION; @EXPECT RESULT_SET 'TEST',1 SELECT 1 AS TEST; COMMIT; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:56.334000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:56.334000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.962000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.962000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; @@ -10790,7 +11906,7 @@ BEGIN TRANSACTION; SELECT 1 AS TEST; COMMIT; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:56.334000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.962000000Z'; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -10834,6 +11950,32 @@ 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; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +COMMIT; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +BEGIN TRANSACTION; +@EXPECT RESULT_SET 'TEST',1 +SELECT 1 AS TEST; +COMMIT; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -10962,6 +12104,14 @@ COMMIT; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; @EXPECT EXCEPTION FAILED_PRECONDITION ABORT BATCH; NEW_CONNECTION; @@ -11083,14 +12233,14 @@ SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; -SET READ_ONLY_STALENESS='READ_TIMESTAMP 2019-07-31T10:46:56.355000000Z'; -@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2019-07-31T10:46:56.355000000Z' +SET READ_ONLY_STALENESS='READ_TIMESTAMP 2020-11-06T18:52:41.990000000Z'; +@EXPECT RESULT_SET 'READ_ONLY_STALENESS','READ_TIMESTAMP 2020-11-06T18:52:41.990000000Z' SHOW VARIABLE READ_ONLY_STALENESS; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @EXPECT EXCEPTION FAILED_PRECONDITION -SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2019-07-31T10:46:56.355000000Z'; +SET READ_ONLY_STALENESS='MIN_READ_TIMESTAMP 2020-11-06T18:52:41.990000000Z'; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; @@ -11114,6 +12264,24 @@ SET AUTOCOMMIT=FALSE; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; +SET OPTIMIZER_VERSION='1'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','1' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='2'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','2' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION='latest'; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','latest' +SHOW VARIABLE OPTIMIZER_VERSION; +SET OPTIMIZER_VERSION=''; +@EXPECT RESULT_SET 'OPTIMIZER_VERSION','' +SHOW VARIABLE OPTIMIZER_VERSION; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; +NEW_CONNECTION; +SET READONLY=TRUE; +SET AUTOCOMMIT=FALSE; NEW_CONNECTION; SET READONLY=TRUE; SET AUTOCOMMIT=FALSE; From a9014bcb4ed381e3a62c297cdaa429e65236d4a0 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Fri, 6 Nov 2020 20:41:48 +0100 Subject: [PATCH 05/33] fix: combine commit timestamp and response methods --- .../connection/SingleUseTransaction.java | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) 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 de5b504302b..0a3aa908455 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 @@ -242,29 +242,19 @@ private boolean hasCommitResponse() { public Timestamp getCommitTimestamp() { ConnectionPreconditions.checkState( hasCommitResponse(), "There is no commit timestamp available for this transaction."); - return writeTransaction != null - ? writeTransaction.getCommitTimestamp() - : txManager.getCommitTimestamp(); + return getCommitResponse().getCommitTimestamp(); } @Override public Timestamp getCommitTimestampOrNull() { - if (hasCommitResponse()) { - try { - return writeTransaction != null - ? writeTransaction.getCommitTimestamp() - : txManager.getCommitTimestamp(); - } catch (SpannerException e) { - // ignore - } - } - return null; + CommitResponse response = getCommitResponseOrNull(); + return response == null ? null : response.getCommitTimestamp(); } @Override public CommitResponse getCommitResponse() { ConnectionPreconditions.checkState( - hasCommitResponse(), "There is no commit timestamp available for this transaction."); + hasCommitResponse(), "There is no commit response available for this transaction."); return writeTransaction != null ? writeTransaction.getCommitResponse() : txManager.getCommitResponse(); From 1063ced85f2ae88d1e6270eeaf95785f324a79ed Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Sat, 7 Nov 2020 08:00:20 +0100 Subject: [PATCH 06/33] fix: clirr-diff and add some tests --- .../clirr-ignored-differences.xml | 17 +++ .../spanner/connection/ConnectionImpl.java | 2 + .../spanner/connection/ConnectionOptions.java | 22 +++- .../AbstractConnectionImplTest.java | 16 +++ .../connection/ConnectionImplTest.java | 121 +++++++++++++++++- 5 files changed, 173 insertions(+), 5 deletions(-) diff --git a/google-cloud-spanner/clirr-ignored-differences.xml b/google-cloud-spanner/clirr-ignored-differences.xml index d5bc93db9f4..f0fb741c6fa 100644 --- a/google-cloud-spanner/clirr-ignored-differences.xml +++ b/google-cloud-spanner/clirr-ignored-differences.xml @@ -464,4 +464,21 @@ com.google.cloud.spanner.AsyncTransactionManager transactionManagerAsync(com.google.cloud.spanner.TransactionOption[]) + + + 7012 + com/google/cloud/spanner/connection/Connection + com.google.cloud.spanner.CommitResponse getCommitResponse() + + + 7012 + com/google/cloud/spanner/connection/Connection + boolean isReturnCommitStats() + + + 7012 + com/google/cloud/spanner/connection/Connection + void setReturnCommitStats(boolean) + + 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 569210c3ab6..c0fc4257740 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 @@ -215,6 +215,7 @@ static UnitOfWorkType of(TransactionMode transactionMode) { this.readOnly = options.isReadOnly(); this.autocommit = options.isAutocommit(); this.queryOptions = this.queryOptions.toBuilder().mergeFrom(options.getQueryOptions()).build(); + this.returnCommitStats = options.isReturnCommitStats(); this.ddlClient = createDdlClient(); setDefaultTransactionOptions(); } @@ -239,6 +240,7 @@ static UnitOfWorkType of(TransactionMode transactionMode) { this.dbClient = dbClient; setReadOnly(options.isReadOnly()); setAutocommit(options.isAutocommit()); + setReturnCommitStats(options.isReturnCommitStats()); setDefaultTransactionOptions(); } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java index d2a341430ef..ce107dbb14a 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java @@ -152,6 +152,7 @@ public String[] getValidValues() { private static final String DEFAULT_NUM_CHANNELS = null; private static final String DEFAULT_USER_AGENT = null; private static final String DEFAULT_OPTIMIZER_VERSION = ""; + private static final boolean DEFAULT_RETURN_COMMIT_STATS = false; private static final String PLAIN_TEXT_PROTOCOL = "http:"; private static final String HOST_PROTOCOL = "https:"; @@ -176,6 +177,8 @@ public String[] getValidValues() { private static final String USER_AGENT_PROPERTY_NAME = "userAgent"; /** Query optimizer version to use for a connection. */ private static final String OPTIMIZER_VERSION_PROPERTY_NAME = "optimizerVersion"; + /** Query optimizer version to use for a connection. */ + private static final String RETURN_COMMIT_STATS_PROPERTY_NAME = "returnCommitStats"; /** All valid connection properties. */ public static final Set VALID_PROPERTIES = @@ -194,7 +197,9 @@ public String[] getValidValues() { ConnectionProperty.createBooleanProperty( USE_PLAIN_TEXT_PROPERTY_NAME, "", DEFAULT_USE_PLAIN_TEXT), ConnectionProperty.createStringProperty(USER_AGENT_PROPERTY_NAME, ""), - ConnectionProperty.createStringProperty(OPTIMIZER_VERSION_PROPERTY_NAME, "")))); + ConnectionProperty.createStringProperty(OPTIMIZER_VERSION_PROPERTY_NAME, ""), + ConnectionProperty.createBooleanProperty( + RETURN_COMMIT_STATS_PROPERTY_NAME, "", DEFAULT_RETURN_COMMIT_STATS)))); private static final Set INTERNAL_PROPERTIES = Collections.unmodifiableSet( @@ -412,6 +417,7 @@ public static Builder newBuilder() { private final Integer numChannels; private final String userAgent; private final QueryOptions queryOptions; + private final boolean returnCommitStats; private final boolean autocommit; private final boolean readOnly; @@ -442,6 +448,7 @@ private ConnectionOptions(Builder builder) { QueryOptions.Builder queryOptionsBuilder = QueryOptions.newBuilder(); queryOptionsBuilder.setOptimizerVersion(parseOptimizerVersion(this.uri)); this.queryOptions = queryOptionsBuilder.build(); + this.returnCommitStats = parseReturnCommitStats(this.uri); this.host = matcher.group(Builder.HOST_GROUP) == null @@ -556,6 +563,12 @@ static String parseOptimizerVersion(String uri) { return value != null ? value : DEFAULT_OPTIMIZER_VERSION; } + @VisibleForTesting + static boolean parseReturnCommitStats(String uri) { + String value = parseUriProperty(uri, RETURN_COMMIT_STATS_PROPERTY_NAME); + return value != null ? Boolean.valueOf(value) : DEFAULT_RETURN_COMMIT_STATS; + } + @VisibleForTesting static String parseUriProperty(String uri, String property) { Pattern pattern = Pattern.compile(String.format("(?is)(?:;|\\?)%s=(.*?)(?:;|$)", property)); @@ -706,6 +719,13 @@ QueryOptions getQueryOptions() { return queryOptions; } + /** + * The initial returnCommitStats value for connections created by this {@link ConnectionOptions} + */ + public boolean isReturnCommitStats() { + return returnCommitStats; + } + /** Interceptors that should be executed after each statement */ List getStatementExecutionInterceptors() { return statementExecutionInterceptors; diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/AbstractConnectionImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/AbstractConnectionImplTest.java index 045bd006caf..cb1fba694c2 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/AbstractConnectionImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/AbstractConnectionImplTest.java @@ -735,6 +735,22 @@ public void testGetCommitTimestamp() { } } + @Test + public void testGetCommitResponse() { + try (Connection connection = getConnection()) { + if (isGetCommitTimestampAllowed()) { + log("@EXPECT RESULT_SET 'COMMIT_TIMESTAMP'"); + log("SHOW VARIABLE COMMIT_RESPONSE;"); + assertThat(connection.getCommitResponse(), is(notNullValue())); + } else { + log("@EXPECT RESULT_SET 'COMMIT_TIMESTAMP',null"); + log("SHOW VARIABLE COMMIT_RESPONSE;"); + exception.expect(matchCode(ErrorCode.FAILED_PRECONDITION)); + connection.getCommitResponse(); + } + } + } + abstract boolean isExecuteAllowed(StatementType type); @Test diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java index 79b09011f44..195b633d5eb 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java @@ -38,11 +38,13 @@ import com.google.cloud.NoCredentials; import com.google.cloud.Timestamp; import com.google.cloud.spanner.CommitResponse; +import com.google.cloud.spanner.CommitStats; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.ForwardingResultSet; import com.google.cloud.spanner.Options; import com.google.cloud.spanner.Options.QueryOption; +import com.google.cloud.spanner.Options.TransactionOption; import com.google.cloud.spanner.ReadContext.QueryAnalyzeMode; import com.google.cloud.spanner.ReadOnlyTransaction; import com.google.cloud.spanner.ResultSet; @@ -77,6 +79,7 @@ import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import org.threeten.bp.Duration; @RunWith(JUnit4.class) public class ConnectionImplTest { @@ -87,9 +90,11 @@ static class SimpleTransactionManager implements TransactionManager { private TransactionState state; private CommitResponse commitResponse; private TransactionContext txContext; + private final boolean returnCommitStats; - private SimpleTransactionManager(TransactionContext txContext) { + private SimpleTransactionManager(TransactionContext txContext, boolean returnCommitStats) { this.txContext = txContext; + this.returnCommitStats = returnCommitStats; } @Override @@ -103,6 +108,13 @@ public void commit() { Timestamp commitTimestamp = Timestamp.now(); commitResponse = mock(CommitResponse.class); when(commitResponse.getCommitTimestamp()).thenReturn(commitTimestamp); + if (returnCommitStats) { + CommitStats stats = mock(CommitStats.class); + when(commitResponse.hasCommitStats()).thenReturn(true); + when(stats.getMutationCount()).thenReturn(5L); + when(stats.getOverloadDelay()).thenReturn(Duration.ofMillis(11L)); + when(commitResponse.getCommitStats()).thenReturn(stats); + } state = TransactionState.COMMITTED; } @@ -206,7 +218,7 @@ private static DdlClient createDefaultMockDdlClient() { } } - public static ConnectionImpl createConnection(ConnectionOptions options) { + public static ConnectionImpl createConnection(final ConnectionOptions options) { Spanner spanner = mock(Spanner.class); SpannerPool spannerPool = mock(SpannerPool.class); when(spannerPool.getSpanner(any(ConnectionOptions.class), any(ConnectionImpl.class))) @@ -251,7 +263,7 @@ public Timestamp answer(InvocationOnMock invocation) { when(dbClient.singleUseReadOnlyTransaction(Matchers.any(TimestampBound.class))) .thenReturn(singleUseReadOnlyTx); - when(dbClient.transactionManager()) + when(dbClient.transactionManager((TransactionOption[]) Mockito.anyVararg())) .thenAnswer( new Answer() { @Override @@ -274,7 +286,7 @@ public ResultSet answer(InvocationOnMock invocation) { when(txContext.analyzeQuery(Statement.of(SELECT), QueryAnalyzeMode.PROFILE)) .thenReturn(select1ResultSetWithStats); when(txContext.executeUpdate(Statement.of(UPDATE))).thenReturn(1L); - return new SimpleTransactionManager(txContext); + return new SimpleTransactionManager(txContext, options.isReturnCommitStats()); } }); @@ -620,6 +632,68 @@ public void testExecuteGetOptimizerVersion() { } } + @Test + public void testExecuteSetReturnCommitStats() { + try (ConnectionImpl subject = + createConnection( + ConnectionOptions.newBuilder() + .setCredentials(NoCredentials.getInstance()) + .setUri(URI) + .build())) { + assertThat(subject.isReturnCommitStats(), is(equalTo(false))); + + StatementResult res = subject.execute(Statement.of("set return_commit_stats=true")); + assertThat(res.getResultType(), is(equalTo(ResultType.NO_RESULT))); + assertThat(subject.isReturnCommitStats(), is(equalTo(true))); + + res = subject.execute(Statement.of("set return_commit_stats=false")); + assertThat(res.getResultType(), is(equalTo(ResultType.NO_RESULT))); + assertThat(subject.isReturnCommitStats(), is(equalTo(false))); + } + } + + @Test + public void testExecuteSetReturnCommitStatsInvalidValue() { + try (ConnectionImpl subject = + createConnection( + ConnectionOptions.newBuilder() + .setCredentials(NoCredentials.getInstance()) + .setUri(URI) + .build())) { + assertThat(subject.isReturnCommitStats(), is(equalTo(false))); + + try { + subject.execute(Statement.of("set return_commit_stats=yes")); + fail("Missing expected exception"); + } catch (SpannerException e) { + assertThat(e.getErrorCode(), is(equalTo(ErrorCode.INVALID_ARGUMENT))); + } + } + } + + @Test + public void testExecuteGetReturnCommitStats() { + try (ConnectionImpl subject = + createConnection( + ConnectionOptions.newBuilder() + .setCredentials(NoCredentials.getInstance()) + .setUri(URI) + .build())) { + assertThat(subject.isReturnCommitStats(), is(equalTo(false))); + + StatementResult res = subject.execute(Statement.of("show variable return_commit_stats")); + assertThat(res.getResultType(), is(equalTo(ResultType.RESULT_SET))); + assertThat(res.getResultSet().next(), is(true)); + assertThat(res.getResultSet().getBoolean("RETURN_COMMIT_STATS"), is(equalTo(false))); + + subject.execute(Statement.of("set return_commit_stats=true")); + res = subject.execute(Statement.of("show variable return_commit_stats")); + assertThat(res.getResultType(), is(equalTo(ResultType.RESULT_SET))); + assertThat(res.getResultSet().next(), is(true)); + assertThat(res.getResultSet().getBoolean("RETURN_COMMIT_STATS"), is(equalTo(true))); + } + } + @Test public void testExecuteSetStatementTimeout() { try (ConnectionImpl subject = @@ -749,6 +823,45 @@ public void testExecuteGetCommitTimestamp() { } } + @Test + public void testExecuteGetCommitResponse() { + try (ConnectionImpl subject = + createConnection( + ConnectionOptions.newBuilder() + .setCredentials(NoCredentials.getInstance()) + .setUri(URI) + .build())) { + subject.beginTransaction(); + subject.executeQuery(Statement.of(AbstractConnectionImplTest.SELECT)).next(); + subject.commit(); + StatementResult res = subject.execute(Statement.of("show variable commit_response")); + assertThat(res.getResultType(), is(equalTo(ResultType.RESULT_SET))); + assertThat(res.getResultSet().next(), is(true)); + assertThat(res.getResultSet().getTimestamp("COMMIT_TIMESTAMP"), is(notNullValue())); + assertThat(res.getResultSet().isNull("MUTATION_COUNT"), is(true)); + assertThat(res.getResultSet().isNull("OVERLOAD_DELAY"), is(true)); + assertThat(res.getResultSet().next(), is(false)); + } + + try (ConnectionImpl subject = + createConnection( + ConnectionOptions.newBuilder() + .setCredentials(NoCredentials.getInstance()) + .setUri(URI + ";returnCommitStats=true") + .build())) { + subject.beginTransaction(); + subject.executeQuery(Statement.of(AbstractConnectionImplTest.SELECT)).next(); + subject.commit(); + StatementResult res = subject.execute(Statement.of("show variable commit_response")); + assertThat(res.getResultType(), is(equalTo(ResultType.RESULT_SET))); + assertThat(res.getResultSet().next(), is(true)); + assertThat(res.getResultSet().getTimestamp("COMMIT_TIMESTAMP"), is(notNullValue())); + assertThat(res.getResultSet().isNull("MUTATION_COUNT"), is(false)); + assertThat(res.getResultSet().isNull("OVERLOAD_DELAY"), is(false)); + assertThat(res.getResultSet().next(), is(false)); + } + } + private static final class StalenessDuration { private final long duration; private final TimeUnit unit; From 2f56c29506bb0611c98729ae9916519e358179b4 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Mon, 9 Nov 2020 08:22:52 +0100 Subject: [PATCH 07/33] fix: remove profile change from this PR --- google-cloud-spanner/pom.xml | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 991ea83666c..67ebc09c456 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -377,38 +377,5 @@ - - - generate-test-sql-scripts - - - - org.codehaus.mojo - exec-maven-plugin - - - generateTestScripts - compile - - java - - - com.google.cloud.spanner.connection.SqlTestScriptsGenerator - - - do_log_statements - true - - - test - false - - - - - - - From 82990542eef1c43d58b50ace3e54c36406ef9d9a Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Thu, 10 Dec 2020 20:12:11 +0100 Subject: [PATCH 08/33] fix: remove overload delay --- .../com/google/cloud/spanner/CommitStats.java | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java index ab24c9907e4..077fd2a3008 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java @@ -17,8 +17,6 @@ package com.google.cloud.spanner; import com.google.common.base.Preconditions; -import org.threeten.bp.Duration; -import org.threeten.bp.temporal.ChronoUnit; /** * Commit statistics are returned by a read/write transaction if specifically requested by passing @@ -26,19 +24,14 @@ */ public class CommitStats { private final long mutationCount; - private final Duration overloadDelay; - private CommitStats(long mutationCount, Duration overloadDelay) { + private CommitStats(long mutationCount) { this.mutationCount = mutationCount; - this.overloadDelay = overloadDelay; } static CommitStats fromProto(com.google.spanner.v1.CommitResponse.CommitStats proto) { Preconditions.checkNotNull(proto); - return new CommitStats( - proto.getMutationCount(), - Duration.of(proto.getOverloadDelay().getSeconds(), ChronoUnit.SECONDS) - .plusNanos(proto.getOverloadDelay().getNanos())); + return new CommitStats(proto.getMutationCount()); } /** @@ -58,9 +51,4 @@ static CommitStats fromProto(com.google.spanner.v1.CommitResponse.CommitStats pr public long getMutationCount() { return mutationCount; } - - /** The duration that the commit was delayed due to overloaded servers. */ - public Duration getOverloadDelay() { - return overloadDelay; - } } From 57a10a8c52a50ac749077de6b05f7132cc4027fa Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Fri, 11 Dec 2020 18:20:23 +0100 Subject: [PATCH 09/33] fix: remove overload delay --- .../spanner/connection/ConnectionStatementExecutorImpl.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 d51f6211c80..9a9cde1cfa8 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 @@ -190,16 +190,13 @@ public StatementResult statementShowCommitResponse() { ResultSets.forRows( Type.struct( StructField.of("COMMIT_TIMESTAMP", Type.timestamp()), - StructField.of("MUTATION_COUNT", Type.int64()), - StructField.of("OVERLOAD_DELAY", Type.string())), + StructField.of("MUTATION_COUNT", Type.int64())), Arrays.asList( Struct.newBuilder() .set("COMMIT_TIMESTAMP") .to(response == null ? null : response.getCommitTimestamp()) .set("MUTATION_COUNT") .to(stats == null ? null : stats.getMutationCount()) - .set("OVERLOAD_DELAY") - .to(stats == null ? null : stats.getOverloadDelay().toString()) .build())); return StatementResultImpl.of(rs, SHOW_COMMIT_RESPONSE); } From 043555d3a2ea76755c5e8a7725edaa65ed0418cc Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Fri, 11 Dec 2020 18:35:19 +0100 Subject: [PATCH 10/33] fix: fix test failure --- .../google/cloud/spanner/connection/ConnectionOptions.java | 2 +- .../google/cloud/spanner/connection/ConnectionImplTest.java | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java index becf1964fbd..696786723fe 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java @@ -595,7 +595,7 @@ static boolean parseReturnCommitStats(String uri) { String value = parseUriProperty(uri, RETURN_COMMIT_STATS_PROPERTY_NAME); return value != null ? Boolean.valueOf(value) : DEFAULT_RETURN_COMMIT_STATS; } - + @VisibleForTesting static boolean parseLenient(String uri) { String value = parseUriProperty(uri, LENIENT_PROPERTY_NAME); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java index 195b633d5eb..1b78d3245aa 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java @@ -79,7 +79,6 @@ import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -import org.threeten.bp.Duration; @RunWith(JUnit4.class) public class ConnectionImplTest { @@ -112,7 +111,6 @@ public void commit() { CommitStats stats = mock(CommitStats.class); when(commitResponse.hasCommitStats()).thenReturn(true); when(stats.getMutationCount()).thenReturn(5L); - when(stats.getOverloadDelay()).thenReturn(Duration.ofMillis(11L)); when(commitResponse.getCommitStats()).thenReturn(stats); } state = TransactionState.COMMITTED; @@ -839,7 +837,6 @@ public void testExecuteGetCommitResponse() { assertThat(res.getResultSet().next(), is(true)); assertThat(res.getResultSet().getTimestamp("COMMIT_TIMESTAMP"), is(notNullValue())); assertThat(res.getResultSet().isNull("MUTATION_COUNT"), is(true)); - assertThat(res.getResultSet().isNull("OVERLOAD_DELAY"), is(true)); assertThat(res.getResultSet().next(), is(false)); } @@ -857,7 +854,6 @@ public void testExecuteGetCommitResponse() { assertThat(res.getResultSet().next(), is(true)); assertThat(res.getResultSet().getTimestamp("COMMIT_TIMESTAMP"), is(notNullValue())); assertThat(res.getResultSet().isNull("MUTATION_COUNT"), is(false)); - assertThat(res.getResultSet().isNull("OVERLOAD_DELAY"), is(false)); assertThat(res.getResultSet().next(), is(false)); } } From 919cf028377a3dc224c5c870b8129aae52d1f911 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Sat, 23 Jan 2021 14:51:34 +0100 Subject: [PATCH 11/33] chore: cleanup after merge --- .../clirr-ignored-differences.xml | 38 +---------------- .../google/cloud/spanner/CommitResponse.java | 7 ++++ .../com/google/cloud/spanner/Options.java | 10 ----- .../com/google/cloud/spanner/SessionImpl.java | 42 ++----------------- .../cloud/spanner/TransactionRunnerImpl.java | 7 +--- .../AsyncTransactionManagerImplTest.java | 3 +- .../cloud/spanner/BaseSessionPoolTest.java | 5 +-- .../cloud/spanner/MockSpannerServiceImpl.java | 2 - .../google/cloud/spanner/SessionPoolTest.java | 6 +-- .../spanner/TransactionManagerImplTest.java | 3 +- .../spanner/TransactionRunnerImplTest.java | 8 ++-- 11 files changed, 22 insertions(+), 109 deletions(-) diff --git a/google-cloud-spanner/clirr-ignored-differences.xml b/google-cloud-spanner/clirr-ignored-differences.xml index cbd1b8e5dc5..fcafcb7c3a1 100644 --- a/google-cloud-spanner/clirr-ignored-differences.xml +++ b/google-cloud-spanner/clirr-ignored-differences.xml @@ -455,18 +455,6 @@ - + diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java index 80bfc42e9e8..233a700eb54 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java @@ -25,6 +25,13 @@ public class CommitResponse { private final com.google.spanner.v1.CommitResponse proto; + public CommitResponse(Timestamp commitTimestamp) { + this.proto = + com.google.spanner.v1.CommitResponse.newBuilder() + .setCommitTimestamp(commitTimestamp.toProto()) + .build(); + } + CommitResponse(com.google.spanner.v1.CommitResponse proto) { this.proto = proto; } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java index 388959405f7..d0c8dde906f 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java @@ -301,16 +301,6 @@ public int hashCode() { return result; } - static Options fromTransactionOptions(TransactionOption... options) { - Options transactionOptions = new Options(); - for (TransactionOption option : options) { - if (option instanceof InternalOption) { - ((InternalOption) option).appendToOptions(transactionOptions); - } - } - return transactionOptions; - } - static Options fromReadOptions(ReadOption... options) { Options readOptions = new Options(); for (ReadOption option : options) { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java index 7840c2c2a68..e7a4da8c7c0 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java @@ -147,11 +147,7 @@ public Void run(TransactionContext ctx) { return null; } }); -<<<<<<< HEAD return runner.getCommitResponse(); -======= - return new CommitResponse(runner.getCommitTimestamp()); ->>>>>>> master } @Override @@ -161,11 +157,7 @@ public Timestamp writeAtLeastOnce(Iterable mutations) throws SpannerEx @Override public CommitResponse writeAtLeastOnceWithOptions( -<<<<<<< HEAD - final Iterable mutations, final TransactionOption... options) -======= Iterable mutations, TransactionOption... transactionOptions) ->>>>>>> master throws SpannerException { setActive(null); List mutationsProto = new ArrayList<>(); @@ -173,7 +165,8 @@ public CommitResponse writeAtLeastOnceWithOptions( final CommitRequest request = CommitRequest.newBuilder() .setSession(name) - .setReturnCommitStats(Options.fromTransactionOptions(options).withCommitStats()) + .setReturnCommitStats( + Options.fromTransactionOptions(transactionOptions).withCommitStats()) .addAllMutations(mutationsProto) .setSingleUseTransaction( TransactionOptions.newBuilder() @@ -183,12 +176,7 @@ public CommitResponse writeAtLeastOnceWithOptions( try (Scope s = tracer.withSpan(span)) { com.google.spanner.v1.CommitResponse response = spanner.getRpc().commit(request, this.options); -<<<<<<< HEAD return new CommitResponse(response); -======= - Timestamp t = Timestamp.fromProto(response.getCommitTimestamp()); - return new CommitResponse(t); ->>>>>>> master } catch (IllegalArgumentException e) { TraceUtil.setWithFailure(span, e); throw newSpannerException(ErrorCode.INTERNAL, "Could not parse commit response", e); @@ -259,44 +247,22 @@ public ReadOnlyTransaction readOnlyTransaction(TimestampBound bound) { @Override public TransactionRunner readWriteTransaction(TransactionOption... options) { -<<<<<<< HEAD - return setActive(new TransactionRunnerImpl(this, Options.fromTransactionOptions(options))); -======= - return setActive( - new TransactionRunnerImpl( - this, spanner.getRpc(), spanner.getDefaultPrefetchChunks(), options)); ->>>>>>> master + return setActive(new TransactionRunnerImpl(this, options)); } @Override public AsyncRunner runAsync(TransactionOption... options) { - return new AsyncRunnerImpl( -<<<<<<< HEAD - setActive(new TransactionRunnerImpl(this, Options.fromTransactionOptions(options)))); -======= - setActive( - new TransactionRunnerImpl( - this, spanner.getRpc(), spanner.getDefaultPrefetchChunks(), options))); ->>>>>>> master + return new AsyncRunnerImpl(setActive(new TransactionRunnerImpl(this, options))); } @Override public TransactionManager transactionManager(TransactionOption... options) { -<<<<<<< HEAD - return new TransactionManagerImpl(this, currentSpan, Options.fromTransactionOptions(options)); -======= return new TransactionManagerImpl(this, currentSpan, options); ->>>>>>> master } @Override public AsyncTransactionManagerImpl transactionManagerAsync(TransactionOption... options) { -<<<<<<< HEAD - return new AsyncTransactionManagerImpl( - this, currentSpan, Options.fromTransactionOptions(options)); -======= return new AsyncTransactionManagerImpl(this, currentSpan, options); ->>>>>>> master } @Override 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 bcba21df01f..430210183bf 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 @@ -31,7 +31,6 @@ import com.google.cloud.spanner.Options.TransactionOption; import com.google.cloud.spanner.Options.UpdateOption; import com.google.cloud.spanner.SessionImpl.SessionTransaction; -import com.google.cloud.spanner.spi.v1.SpannerRpc; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; @@ -824,11 +823,7 @@ public TransactionRunner allowNestedTransaction() { return this; } - TransactionRunnerImpl( - SessionImpl session, - SpannerRpc rpc, - int defaultPrefetchChunks, - TransactionOption... options) { + TransactionRunnerImpl(SessionImpl session, TransactionOption... options) { this.session = session; this.options = Options.fromTransactionOptions(options); this.txn = session.newTransaction(this.options); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java index 03f024285d6..199058c47b4 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java @@ -44,8 +44,7 @@ public void setUp() { @Test public void commitReturnsCommitStats() { try (AsyncTransactionManagerImpl manager = - new AsyncTransactionManagerImpl( - session, mock(Span.class), Options.fromTransactionOptions(Options.commitStats()))) { + new AsyncTransactionManagerImpl(session, mock(Span.class), Options.commitStats())) { when(session.newTransaction(Options.fromTransactionOptions(Options.commitStats()))) .thenReturn(txn); when(txn.ensureTxnAsync()).thenReturn(ApiFutures.immediateFuture(null)); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/BaseSessionPoolTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/BaseSessionPoolTest.java index 6fd6a4383e3..3db2bdb1c4f 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/BaseSessionPoolTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/BaseSessionPoolTest.java @@ -24,7 +24,6 @@ import static org.mockito.Mockito.when; import com.google.api.core.ApiFutures; -import com.google.cloud.Timestamp; import com.google.cloud.grpc.GrpcTransportOptions.ExecutorFactory; import com.google.cloud.spanner.SessionPool.Clock; import com.google.protobuf.Empty; @@ -67,9 +66,9 @@ SessionImpl mockSession() { "projects/dummy/instances/dummy/database/dummy/sessions/session" + sessionIndex); when(session.asyncClose()).thenReturn(ApiFutures.immediateFuture(Empty.getDefaultInstance())); when(session.writeWithOptions(any(Iterable.class))) - .thenReturn(new CommitResponse(Timestamp.now())); + .thenReturn(new CommitResponse(com.google.spanner.v1.CommitResponse.getDefaultInstance())); when(session.writeAtLeastOnceWithOptions(any(Iterable.class))) - .thenReturn(new CommitResponse(Timestamp.now())); + .thenReturn(new CommitResponse(com.google.spanner.v1.CommitResponse.getDefaultInstance())); sessionIndex++; return session; } 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 c9fa6ddff7f..a48d15b1e5c 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 @@ -1819,8 +1819,6 @@ public void commit(CommitRequest request, StreamObserver respons com.google.spanner.v1.CommitResponse.CommitStats.newBuilder() // This is not really always equal, but at least it returns a value. .setMutationCount(request.getMutationsCount()) - .setOverloadDelay( - Duration.newBuilder().setSeconds(0L).setNanos(RANDOM.nextInt(1_000_000_000))) .build()); } responseObserver.onNext(responseBuilder.build()); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java index cfb4a71e5f5..db6e22b9232 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java @@ -900,8 +900,7 @@ public void testSessionNotFoundReadWriteTransaction() { when(closedSession.newTransaction(Options.fromTransactionOptions())) .thenReturn(closedTransactionContext); when(closedSession.beginTransactionAsync()).thenThrow(sessionNotFound); - TransactionRunnerImpl closedTransactionRunner = - new TransactionRunnerImpl(closedSession, Options.fromTransactionOptions()); + TransactionRunnerImpl closedTransactionRunner = new TransactionRunnerImpl(closedSession); closedTransactionRunner.setSpan(mock(Span.class)); when(closedSession.readWriteTransaction()).thenReturn(closedTransactionRunner); @@ -915,8 +914,7 @@ public void testSessionNotFoundReadWriteTransaction() { .thenReturn(openTransactionContext); when(openSession.beginTransactionAsync()) .thenReturn(ApiFutures.immediateFuture(ByteString.copyFromUtf8("open-txn"))); - TransactionRunnerImpl openTransactionRunner = - new TransactionRunnerImpl(openSession, Options.fromTransactionOptions()); + TransactionRunnerImpl openTransactionRunner = new TransactionRunnerImpl(openSession); openTransactionRunner.setSpan(mock(Span.class)); when(openSession.readWriteTransaction()).thenReturn(openTransactionRunner); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java index 32731c360b9..5c2607f6252 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java @@ -81,8 +81,7 @@ public void release(ScheduledExecutorService exec) { @Before public void setUp() { initMocks(this); - manager = - new TransactionManagerImpl(session, mock(Span.class), Options.fromTransactionOptions()); + manager = new TransactionManagerImpl(session, mock(Span.class)); } @Test diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java index 915c48fa786..b65f70b3845 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java @@ -123,7 +123,7 @@ public ResultSet answer(InvocationOnMock invocation) throws Throwable { return builder.build(); } }); - transactionRunner = new TransactionRunnerImpl(session, Options.fromTransactionOptions()); + transactionRunner = new TransactionRunnerImpl(session); when(rpc.commitAsync(Mockito.any(CommitRequest.class), Mockito.anyMap())) .thenReturn( ApiFutures.immediateFuture( @@ -323,8 +323,7 @@ public void prepareReadWriteTransaction() { } }; session.setCurrentSpan(mock(Span.class)); - TransactionRunnerImpl runner = - new TransactionRunnerImpl(session, Options.fromTransactionOptions()); + TransactionRunnerImpl runner = new TransactionRunnerImpl(session); runner.setSpan(mock(Span.class)); assertThat(usedInlinedBegin).isFalse(); runner.run( @@ -357,8 +356,7 @@ private long[] batchDmlException(int status) { .thenReturn( ApiFutures.immediateFuture(ByteString.copyFromUtf8(UUID.randomUUID().toString()))); when(session.getName()).thenReturn(SessionId.of("p", "i", "d", "test").getName()); - TransactionRunnerImpl runner = - new TransactionRunnerImpl(session, Options.fromTransactionOptions()); + TransactionRunnerImpl runner = new TransactionRunnerImpl(session); runner.setSpan(mock(Span.class)); ExecuteBatchDmlResponse response1 = ExecuteBatchDmlResponse.newBuilder() From 97ec9175bee38ba64aadb960d6efdf57a5ad2b20 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Sat, 23 Jan 2021 15:01:16 +0100 Subject: [PATCH 12/33] fix: update copyright years of new files --- .../main/java/com/google/cloud/spanner/AsyncRunner.java | 8 ++++---- .../main/java/com/google/cloud/spanner/CommitStats.java | 2 +- .../cloud/spanner/AsyncTransactionManagerImplTest.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunner.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunner.java index f1a5b7feeee..8f88f38aa6e 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunner.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunner.java @@ -52,14 +52,14 @@ interface AsyncWork { ApiFuture runAsync(AsyncWork work, Executor executor); /** - * Returns the timestamp at which the transaction committed. The {@link ApiFuture#get()} will - * throw an {@link ExecutionException} if the transaction did not commit. + * Returns the timestamp at which the transaction committed. {@link ApiFuture#get()} will throw an + * {@link ExecutionException} if the transaction did not commit. */ ApiFuture getCommitTimestamp(); /** - * Returns the {@link CommitResponse} of this transaction. The {@link ApiFuture#get()} will throw - * an {@link ExecutionException} if the transaction did not commit. + * Returns the {@link CommitResponse} of this transaction. {@link ApiFuture#get()} will throw an + * {@link ExecutionException} if the transaction did not commit. */ ApiFuture getCommitResponse(); } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java index 077fd2a3008..95b2d7e43a6 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Google LLC + * Copyright 2021 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/AsyncTransactionManagerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java index 199058c47b4..895b4fb9127 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Google LLC + * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From afeb0fd86a8248a244a5b52cbf4e2065db65bf30 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Sat, 23 Jan 2021 15:25:16 +0100 Subject: [PATCH 13/33] test: fix flaky test --- .../com/google/cloud/spanner/InlineBeginTransactionTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java index e86ffd85543..88c2afd6503 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java @@ -1463,7 +1463,7 @@ public Void run(TransactionContext transaction) throws Exception { } else { impl.waitForTransactionTimeoutMillis = 60_000L; } - transaction.executeUpdateAsync(UPDATE_STATEMENT); + ApiFuture updateCount = transaction.executeUpdateAsync(UPDATE_STATEMENT); // Try to execute a query. This will timeout during the first attempt while waiting // for the first statement to return a transaction, and then force a retry of the @@ -1472,6 +1472,9 @@ public Void run(TransactionContext transaction) throws Exception { while (rs.next()) {} } catch (Throwable t) { mockSpanner.unfreeze(); + // Wait until the update actually finishes so it has returned a transaction. + // That should ensure that the retry does not issue a BeginTransaction RPC. + SpannerApiFutures.get(updateCount); throw t; } return null; From 8524526a0588ae7d942199a2f831473b70d4a0d1 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Sat, 23 Jan 2021 16:20:09 +0100 Subject: [PATCH 14/33] test: skip commit stats tests on emulator --- .../com/google/cloud/spanner/it/ITTransactionManagerTest.java | 1 + .../java/com/google/cloud/spanner/it/ITTransactionTest.java | 1 + .../src/test/java/com/google/cloud/spanner/it/ITWriteTest.java | 3 +++ 3 files changed, 5 insertions(+) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java index 5b43eef8548..3039185ae5d 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java @@ -217,6 +217,7 @@ public void abortAndRetry() throws InterruptedException { @SuppressWarnings("resource") @Test public void transactionManagerReturnsCommitStats() throws InterruptedException { + assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); try (TransactionManager manager = client.transactionManager(Options.commitStats())) { TransactionContext txn = manager.begin(); while (true) { diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java index 5a0c8dc7e38..1c789f7c51c 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java @@ -634,6 +634,7 @@ public Long run(TransactionContext transaction) throws Exception { @Test public void transactionRunnerReturnsCommitStats() { + assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); final String key = uniqueKey(); TransactionRunner runner = client.readWriteTransaction(Options.commitStats()); runner.run( diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java index 9dd04e3dd8d..a4c0392cbd7 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java @@ -17,6 +17,7 @@ package com.google.cloud.spanner.it; import static com.google.cloud.spanner.SpannerMatchers.isSpannerException; +import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; @@ -161,6 +162,7 @@ public void writeAtLeastOnce() { @Test public void writeReturnsCommitStats() { + assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); CommitResponse response = client.writeWithOptions( Arrays.asList( @@ -179,6 +181,7 @@ public void writeReturnsCommitStats() { @Test public void writeAtLeastOnceReturnsCommitStats() { + assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); CommitResponse response = client.writeAtLeastOnceWithOptions( Arrays.asList( From 06b3e22760a5d5a968717250f0f260cc2d7ecf11 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Sat, 23 Jan 2021 16:32:35 +0100 Subject: [PATCH 15/33] test: missed one commit stats tests against emulator --- .../test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java index d08e6b3f666..959bc7a93d9 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java @@ -17,8 +17,10 @@ package com.google.cloud.spanner.it; import static com.google.cloud.spanner.SpannerApiFutures.get; +import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; +import static org.junit.Assume.assumeFalse; import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutures; @@ -317,6 +319,7 @@ public ApiFuture doWorkAsync(TransactionContext txn) { @Test public void asyncRunnerReturnsCommitStats() { + assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); AsyncRunner runner = client.runAsync(Options.commitStats()); runner.runAsync( new AsyncWork() { From 1c17d16efddb1839884376c6066faadce8181684 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Sat, 23 Jan 2021 16:47:36 +0100 Subject: [PATCH 16/33] test: skip another emulator test --- .../test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java index 959bc7a93d9..ee8e771bcfd 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java @@ -343,6 +343,7 @@ public ApiFuture doWorkAsync(TransactionContext txn) { @Test public void asyncTransactionManagerReturnsCommitStats() throws InterruptedException { + assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); try (AsyncTransactionManager mgr = client.transactionManagerAsync(Options.commitStats())) { TransactionContextFuture ctx = mgr.beginAsync(); while (true) { From 664b87daf36668699cbc54dfc544ef64616f6da2 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Sat, 23 Jan 2021 20:45:21 +0100 Subject: [PATCH 17/33] test: add missing test cases --- .../google/cloud/spanner/AsyncRunnerImpl.java | 8 +- .../cloud/spanner/AsyncRunnerImplTest.java | 151 ++++++++++++++++++ .../cloud/spanner/CommitResponseTest.java | 78 +++++++++ .../com/google/cloud/spanner/OptionsTest.java | 12 ++ 4 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncRunnerImplTest.java create mode 100644 google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunnerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunnerImpl.java index 85099d83fd2..7982f0d2822 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunnerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunnerImpl.java @@ -16,6 +16,8 @@ package com.google.cloud.spanner; +import static com.google.common.base.Preconditions.checkState; + import com.google.api.core.ApiFunction; import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutures; @@ -29,7 +31,7 @@ class AsyncRunnerImpl implements AsyncRunner { private final TransactionRunnerImpl delegate; - private final SettableApiFuture commitResponse = SettableApiFuture.create(); + private SettableApiFuture commitResponse; AsyncRunnerImpl(TransactionRunnerImpl delegate) { this.delegate = Preconditions.checkNotNull(delegate); @@ -37,6 +39,8 @@ class AsyncRunnerImpl implements AsyncRunner { @Override public ApiFuture runAsync(final AsyncWork work, Executor executor) { + Preconditions.checkState(commitResponse == null, "runAsync() can only be called once"); + commitResponse = SettableApiFuture.create(); final SettableApiFuture res = SettableApiFuture.create(); executor.execute( new Runnable() { @@ -80,6 +84,7 @@ private void setCommitResponse() { @Override public ApiFuture getCommitTimestamp() { + checkState(commitResponse != null, "runAsync() has not yet been called"); return ApiFutures.transform( commitResponse, new ApiFunction() { @@ -92,6 +97,7 @@ public Timestamp apply(CommitResponse input) { } public ApiFuture getCommitResponse() { + checkState(commitResponse != null, "runAsync() has not yet been called"); return commitResponse; } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncRunnerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncRunnerImplTest.java new file mode 100644 index 00000000000..3f74a71832d --- /dev/null +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncRunnerImplTest.java @@ -0,0 +1,151 @@ +/* + * Copyright 2021 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; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.fail; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.google.api.core.ApiFuture; +import com.google.api.core.ApiFutures; +import com.google.cloud.spanner.AsyncRunner.AsyncWork; +import com.google.cloud.spanner.TransactionRunner.TransactionCallable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import org.junit.AfterClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class AsyncRunnerImplTest { + private static final ExecutorService executor = Executors.newSingleThreadExecutor(); + + @AfterClass + public static void teardown() { + executor.shutdown(); + } + + @SuppressWarnings("unchecked") + @Test + public void testAsyncRunReturnsResultAndCommitResponse() { + final Object expectedResult = new Object(); + final CommitResponse expectedCommitResponse = mock(CommitResponse.class); + + TransactionRunnerImpl delegate = mock(TransactionRunnerImpl.class); + when(delegate.run(any(TransactionCallable.class))).thenReturn(expectedResult); + when(delegate.getCommitResponse()).thenReturn(expectedCommitResponse); + + AsyncRunnerImpl runner = new AsyncRunnerImpl(delegate); + ApiFuture result = + runner.runAsync( + new AsyncWork() { + @Override + public ApiFuture doWorkAsync(TransactionContext txn) { + return ApiFutures.immediateFuture(expectedResult); + } + }, + executor); + + assertThat(SpannerApiFutures.get(result)).isSameInstanceAs(expectedResult); + assertThat(SpannerApiFutures.get(runner.getCommitResponse())) + .isSameInstanceAs(expectedCommitResponse); + } + + @Test + public void testGetCommitTimestampReturnsErrorBeforeRun() { + TransactionRunnerImpl delegate = mock(TransactionRunnerImpl.class); + AsyncRunnerImpl runner = new AsyncRunnerImpl(delegate); + try { + runner.getCommitTimestamp(); + fail("missing expected exception"); + } catch (IllegalStateException e) { + assertThat(e.getMessage()).contains("runAsync() has not yet been called"); + } + } + + @Test + public void testGetCommitResponseReturnsErrorBeforeRun() { + TransactionRunnerImpl delegate = mock(TransactionRunnerImpl.class); + AsyncRunnerImpl runner = new AsyncRunnerImpl(delegate); + try { + runner.getCommitResponse(); + fail("missing expected exception"); + } catch (IllegalStateException e) { + assertThat(e.getMessage()).contains("runAsync() has not yet been called"); + } + } + + @Test + public void testGetCommitResponseReturnsErrorIfRunFails() { + final SpannerException expectedException = + SpannerExceptionFactory.newSpannerException(ErrorCode.ALREADY_EXISTS, "Row already exists"); + + TransactionRunnerImpl delegate = mock(TransactionRunnerImpl.class); + when(delegate.getCommitResponse()).thenThrow(expectedException); + + AsyncRunnerImpl runner = new AsyncRunnerImpl(delegate); + runner.runAsync( + new AsyncWork() { + @Override + public ApiFuture doWorkAsync(TransactionContext txn) { + return ApiFutures.immediateFailedFuture(expectedException); + } + }, + executor); + + try { + SpannerApiFutures.get(runner.getCommitResponse()); + fail("missing expected exception"); + } catch (SpannerException e) { + assertThat(e).isSameInstanceAs(expectedException); + } + } + + @Test + public void testRunAyncFailsIfCalledMultipleTimes() { + final Object result = new Object(); + TransactionRunnerImpl delegate = mock(TransactionRunnerImpl.class); + when(delegate.run(any(TransactionCallable.class))).thenReturn(result); + + AsyncRunnerImpl runner = new AsyncRunnerImpl(delegate); + runner.runAsync( + new AsyncWork() { + @Override + public ApiFuture doWorkAsync(TransactionContext txn) { + return ApiFutures.immediateFuture(result); + } + }, + executor); + + try { + runner.runAsync( + new AsyncWork() { + @Override + public ApiFuture doWorkAsync(TransactionContext txn) { + return ApiFutures.immediateFuture(null); + } + }, + executor); + fail("missing expected exception"); + } catch (IllegalStateException e) { + assertThat(e.getMessage()).contains("runAsync() can only be called once"); + } + } +} diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java new file mode 100644 index 00000000000..f106b38ff56 --- /dev/null +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2021 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; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.cloud.Timestamp; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class CommitResponseTest { + + @Test + public void testFromProto() { + long mutationCount = 5L; + com.google.protobuf.Timestamp timestamp = + com.google.protobuf.Timestamp.newBuilder().setSeconds(123L).setNanos(456).build(); + com.google.spanner.v1.CommitResponse proto = + com.google.spanner.v1.CommitResponse.newBuilder() + .setCommitStats( + com.google.spanner.v1.CommitResponse.CommitStats.newBuilder() + .setMutationCount(mutationCount) + .build()) + .setCommitTimestamp(timestamp) + .build(); + + CommitResponse response = new CommitResponse(proto); + + assertThat(response.getCommitTimestamp()).isEqualTo(Timestamp.ofTimeSecondsAndNanos(123L, 456)); + assertThat(response.getCommitStats().getMutationCount()).isEqualTo(mutationCount); + } + + @Test + public void testEqualsAndHashCode() { + com.google.spanner.v1.CommitResponse proto1 = + com.google.spanner.v1.CommitResponse.newBuilder() + .setCommitTimestamp(com.google.protobuf.Timestamp.newBuilder().setSeconds(1L).build()) + .build(); + com.google.spanner.v1.CommitResponse proto2 = + com.google.spanner.v1.CommitResponse.newBuilder() + .setCommitTimestamp(com.google.protobuf.Timestamp.newBuilder().setSeconds(2L).build()) + .build(); + com.google.spanner.v1.CommitResponse proto3 = + com.google.spanner.v1.CommitResponse.newBuilder() + .setCommitTimestamp(com.google.protobuf.Timestamp.newBuilder().setSeconds(1L).build()) + .build(); + + CommitResponse response1 = new CommitResponse(proto1); + CommitResponse response2 = new CommitResponse(proto2); + CommitResponse response3 = new CommitResponse(proto3); + + assertThat(response1).isEqualTo(response3); + assertThat(response1).isNotEqualTo(response2); + assertThat(response2).isNotEqualTo(response3); + assertThat(response1.equals(null)).isFalse(); + assertThat(response1.equals(new Object())).isFalse(); + + assertThat(response1.hashCode()).isEqualTo(response3.hashCode()); + assertThat(response1.hashCode()).isNotEqualTo(response2.hashCode()); + assertThat(response2.hashCode()).isNotEqualTo(response3.hashCode()); + } +} diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java index 5a2777570b7..ecf1404f0db 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java @@ -224,6 +224,9 @@ public void queryEquality() { public void testFromTransactionOptions() { Options opts = Options.fromTransactionOptions(); assertThat(opts.toString()).isEqualTo(""); + + opts = Options.fromTransactionOptions(Options.commitStats()); + assertThat(opts.toString()).contains("withCommitStats: true"); } @Test @@ -237,6 +240,15 @@ public void testTransactionOptionsEquality() { o2 = Options.fromReadOptions(Options.prefetchChunks(1)); assertThat(o1.equals(o2)).isFalse(); + + o1 = Options.fromTransactionOptions(Options.commitStats()); + o2 = Options.fromTransactionOptions(Options.commitStats()); + assertThat(o1.equals(o2)).isTrue(); + assertThat(o1.hashCode()).isEqualTo(o2.hashCode()); + + o2 = Options.fromTransactionOptions(); + assertThat(o1.equals(o2)).isFalse(); + assertThat(o1.hashCode()).isNotEqualTo(o2.hashCode()); } @Test From 6573a0f7fe07f75ab9ed8e0e1d474540b5cb6b70 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Sat, 30 Jan 2021 17:10:03 +0100 Subject: [PATCH 18/33] fix: address review comments --- .../com/google/cloud/spanner/Options.java | 2 +- .../com/google/cloud/spanner/OptionsTest.java | 49 ++++++++++++++----- .../cloud/spanner/it/ITAsyncAPITest.java | 7 +-- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java index d0c8dde906f..7c0eab2cdb4 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java @@ -278,7 +278,7 @@ public boolean equals(Object o) { public int hashCode() { int result = 31; if (withCommitStats) { - result = 31 * result + Boolean.valueOf(withCommitStats).hashCode(); + result = 31 * result + 1231; } if (limit != null) { result = 31 * result + limit.hashCode(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java index ecf1404f0db..725db5bf546 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java @@ -221,33 +221,56 @@ public void queryEquality() { } @Test - public void testFromTransactionOptions() { + public void testFromTransactionOptions_toStringNoOptions() { Options opts = Options.fromTransactionOptions(); assertThat(opts.toString()).isEqualTo(""); + } - opts = Options.fromTransactionOptions(Options.commitStats()); + @Test + public void testFromTransactionOptions_toStringWithCommitStats() { + Options opts = Options.fromTransactionOptions(Options.commitStats()); assertThat(opts.toString()).contains("withCommitStats: true"); } @Test - public void testTransactionOptionsEquality() { - Options o1; - Options o2; + public void testTransactionOptions_noOptionsAreEqual() { + Options o1 = Options.fromTransactionOptions(); + Options o2 = Options.fromTransactionOptions(); + assertThat(o1.equals(o2)).isTrue(); + } - o1 = Options.fromTransactionOptions(); - o2 = Options.fromTransactionOptions(); + @Test + public void testTransactionOptions_withCommitStatsAreEqual() { + Options o1 = Options.fromTransactionOptions(Options.commitStats()); + Options o2 = Options.fromTransactionOptions(Options.commitStats()); assertThat(o1.equals(o2)).isTrue(); + } - o2 = Options.fromReadOptions(Options.prefetchChunks(1)); + @Test + public void testTransactionOptions_withCommitStatsAndOtherOptionAreNotEqual() { + Options o1 = Options.fromTransactionOptions(Options.commitStats()); + Options o2 = Options.fromQueryOptions(Options.prefetchChunks(10)); assertThat(o1.equals(o2)).isFalse(); + } - o1 = Options.fromTransactionOptions(Options.commitStats()); - o2 = Options.fromTransactionOptions(Options.commitStats()); - assertThat(o1.equals(o2)).isTrue(); + @Test + public void testTransactionOptions_noOptionsHashCode() { + Options o1 = Options.fromTransactionOptions(); + Options o2 = Options.fromTransactionOptions(); assertThat(o1.hashCode()).isEqualTo(o2.hashCode()); + } - o2 = Options.fromTransactionOptions(); - assertThat(o1.equals(o2)).isFalse(); + @Test + public void testTransactionOptions_withCommitStatsHashCode() { + Options o1 = Options.fromTransactionOptions(Options.commitStats()); + Options o2 = Options.fromTransactionOptions(Options.commitStats()); + assertThat(o1.hashCode()).isEqualTo(o2.hashCode()); + } + + @Test + public void testTransactionOptions_withCommitStatsAndOtherOptionHashCode() { + Options o1 = Options.fromTransactionOptions(Options.commitStats()); + Options o2 = Options.fromQueryOptions(Options.prefetchChunks(10)); assertThat(o1.hashCode()).isNotEqualTo(o2.hashCode()); } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java index ee8e771bcfd..c9475c19f48 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java @@ -345,11 +345,12 @@ public ApiFuture doWorkAsync(TransactionContext txn) { public void asyncTransactionManagerReturnsCommitStats() throws InterruptedException { assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); try (AsyncTransactionManager mgr = client.transactionManagerAsync(Options.commitStats())) { - TransactionContextFuture ctx = mgr.beginAsync(); + TransactionContextFuture context = mgr.beginAsync(); while (true) { try { get( - ctx.then( + context + .then( new AsyncTransactionFunction() { @Override public ApiFuture apply(TransactionContext txn, Void input) @@ -372,7 +373,7 @@ public ApiFuture apply(TransactionContext txn, Void input) break; } catch (AbortedException e) { Thread.sleep(e.getRetryDelayInMillis() / 1000); - ctx = mgr.resetForRetryAsync(); + context = mgr.resetForRetryAsync(); } } } From 57ea714b5d5bae5a91178351efd98c8c6272037a Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Wed, 3 Feb 2021 18:20:16 +0100 Subject: [PATCH 19/33] chore: use junit assertion instead of truth --- .../java/com/google/cloud/spanner/it/ITTransactionTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java index 1c789f7c51c..8532fd77c5a 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java @@ -19,6 +19,7 @@ import static com.google.cloud.spanner.SpannerExceptionFactory.newSpannerException; import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; @@ -646,7 +647,7 @@ public Void run(TransactionContext transaction) throws Exception { return null; } }); - assertThat(runner.getCommitResponse().getCommitStats()).isNotNull(); + assertNotNull(runner.getCommitResponse().getCommitStats()); // MutationCount = 2 (2 columns). assertThat(runner.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); } From 1b077e457d40dd1f64c20a9f7d897313f78ea4e9 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Wed, 3 Feb 2021 18:47:23 +0100 Subject: [PATCH 20/33] chore: cleanup after merge --- .../main/java/com/google/cloud/spanner/Options.java | 10 ---------- .../java/com/google/cloud/spanner/SessionImpl.java | 12 ++++-------- .../google/cloud/spanner/TransactionRunnerImpl.java | 6 +----- .../spanner/AsyncTransactionManagerImplTest.java | 3 +-- .../google/cloud/spanner/BaseSessionPoolTest.java | 12 ++++++++++-- .../google/cloud/spanner/MockSpannerServiceImpl.java | 2 -- .../com/google/cloud/spanner/SessionPoolTest.java | 6 ++---- .../cloud/spanner/TransactionManagerImplTest.java | 3 +-- .../cloud/spanner/TransactionRunnerImplTest.java | 8 +++----- 9 files changed, 22 insertions(+), 40 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java index 388959405f7..d0c8dde906f 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java @@ -301,16 +301,6 @@ public int hashCode() { return result; } - static Options fromTransactionOptions(TransactionOption... options) { - Options transactionOptions = new Options(); - for (TransactionOption option : options) { - if (option instanceof InternalOption) { - ((InternalOption) option).appendToOptions(transactionOptions); - } - } - return transactionOptions; - } - static Options fromReadOptions(ReadOption... options) { Options readOptions = new Options(); for (ReadOption option : options) { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java index cb639fffdcc..e7a4da8c7c0 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java @@ -165,7 +165,8 @@ public CommitResponse writeAtLeastOnceWithOptions( final CommitRequest request = CommitRequest.newBuilder() .setSession(name) - .setReturnCommitStats(Options.fromTransactionOptions(transactionOptions).withCommitStats()) + .setReturnCommitStats( + Options.fromTransactionOptions(transactionOptions).withCommitStats()) .addAllMutations(mutationsProto) .setSingleUseTransaction( TransactionOptions.newBuilder() @@ -246,17 +247,12 @@ public ReadOnlyTransaction readOnlyTransaction(TimestampBound bound) { @Override public TransactionRunner readWriteTransaction(TransactionOption... options) { - return setActive( - new TransactionRunnerImpl( - this, spanner.getRpc(), spanner.getDefaultPrefetchChunks(), options)); + return setActive(new TransactionRunnerImpl(this, options)); } @Override public AsyncRunner runAsync(TransactionOption... options) { - return new AsyncRunnerImpl( - setActive( - new TransactionRunnerImpl( - this, spanner.getRpc(), spanner.getDefaultPrefetchChunks(), options))); + return new AsyncRunnerImpl(setActive(new TransactionRunnerImpl(this, options))); } @Override 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 7eb1b23a948..dbbbca068a0 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 @@ -826,11 +826,7 @@ public TransactionRunner allowNestedTransaction() { return this; } - TransactionRunnerImpl( - SessionImpl session, - SpannerRpc rpc, - int defaultPrefetchChunks, - TransactionOption... options) { + TransactionRunnerImpl(SessionImpl session, TransactionOption... options) { this.session = session; this.options = Options.fromTransactionOptions(options); this.txn = session.newTransaction(this.options); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java index 03f024285d6..199058c47b4 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java @@ -44,8 +44,7 @@ public void setUp() { @Test public void commitReturnsCommitStats() { try (AsyncTransactionManagerImpl manager = - new AsyncTransactionManagerImpl( - session, mock(Span.class), Options.fromTransactionOptions(Options.commitStats()))) { + new AsyncTransactionManagerImpl(session, mock(Span.class), Options.commitStats())) { when(session.newTransaction(Options.fromTransactionOptions(Options.commitStats()))) .thenReturn(txn); when(txn.ensureTxnAsync()).thenReturn(ApiFutures.immediateFuture(null)); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/BaseSessionPoolTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/BaseSessionPoolTest.java index 6fd6a4383e3..2c8437f21d6 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/BaseSessionPoolTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/BaseSessionPoolTest.java @@ -67,9 +67,17 @@ SessionImpl mockSession() { "projects/dummy/instances/dummy/database/dummy/sessions/session" + sessionIndex); when(session.asyncClose()).thenReturn(ApiFutures.immediateFuture(Empty.getDefaultInstance())); when(session.writeWithOptions(any(Iterable.class))) - .thenReturn(new CommitResponse(Timestamp.now())); + .thenReturn( + new CommitResponse( + com.google.spanner.v1.CommitResponse.newBuilder() + .setCommitTimestamp(Timestamp.now().toProto()) + .build())); when(session.writeAtLeastOnceWithOptions(any(Iterable.class))) - .thenReturn(new CommitResponse(Timestamp.now())); + .thenReturn( + new CommitResponse( + com.google.spanner.v1.CommitResponse.newBuilder() + .setCommitTimestamp(Timestamp.now().toProto()) + .build())); sessionIndex++; return session; } 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 f60a216d5cf..598a1952f00 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 @@ -1819,8 +1819,6 @@ public void commit(CommitRequest request, StreamObserver respons com.google.spanner.v1.CommitResponse.CommitStats.newBuilder() // This is not really always equal, but at least it returns a value. .setMutationCount(request.getMutationsCount()) - .setOverloadDelay( - Duration.newBuilder().setSeconds(0L).setNanos(RANDOM.nextInt(1_000_000_000))) .build()); } responseObserver.onNext(responseBuilder.build()); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java index 532385e84b3..337510757d8 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java @@ -900,8 +900,7 @@ public void testSessionNotFoundReadWriteTransaction() { when(closedSession.newTransaction(Options.fromTransactionOptions())) .thenReturn(closedTransactionContext); when(closedSession.beginTransactionAsync()).thenThrow(sessionNotFound); - TransactionRunnerImpl closedTransactionRunner = - new TransactionRunnerImpl(closedSession, Options.fromTransactionOptions()); + TransactionRunnerImpl closedTransactionRunner = new TransactionRunnerImpl(closedSession); closedTransactionRunner.setSpan(mock(Span.class)); when(closedSession.readWriteTransaction()).thenReturn(closedTransactionRunner); @@ -915,8 +914,7 @@ public void testSessionNotFoundReadWriteTransaction() { .thenReturn(openTransactionContext); when(openSession.beginTransactionAsync()) .thenReturn(ApiFutures.immediateFuture(ByteString.copyFromUtf8("open-txn"))); - TransactionRunnerImpl openTransactionRunner = - new TransactionRunnerImpl(openSession, Options.fromTransactionOptions()); + TransactionRunnerImpl openTransactionRunner = new TransactionRunnerImpl(openSession); openTransactionRunner.setSpan(mock(Span.class)); when(openSession.readWriteTransaction()).thenReturn(openTransactionRunner); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java index 32731c360b9..5c2607f6252 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java @@ -81,8 +81,7 @@ public void release(ScheduledExecutorService exec) { @Before public void setUp() { initMocks(this); - manager = - new TransactionManagerImpl(session, mock(Span.class), Options.fromTransactionOptions()); + manager = new TransactionManagerImpl(session, mock(Span.class)); } @Test diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java index 915c48fa786..b65f70b3845 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java @@ -123,7 +123,7 @@ public ResultSet answer(InvocationOnMock invocation) throws Throwable { return builder.build(); } }); - transactionRunner = new TransactionRunnerImpl(session, Options.fromTransactionOptions()); + transactionRunner = new TransactionRunnerImpl(session); when(rpc.commitAsync(Mockito.any(CommitRequest.class), Mockito.anyMap())) .thenReturn( ApiFutures.immediateFuture( @@ -323,8 +323,7 @@ public void prepareReadWriteTransaction() { } }; session.setCurrentSpan(mock(Span.class)); - TransactionRunnerImpl runner = - new TransactionRunnerImpl(session, Options.fromTransactionOptions()); + TransactionRunnerImpl runner = new TransactionRunnerImpl(session); runner.setSpan(mock(Span.class)); assertThat(usedInlinedBegin).isFalse(); runner.run( @@ -357,8 +356,7 @@ private long[] batchDmlException(int status) { .thenReturn( ApiFutures.immediateFuture(ByteString.copyFromUtf8(UUID.randomUUID().toString()))); when(session.getName()).thenReturn(SessionId.of("p", "i", "d", "test").getName()); - TransactionRunnerImpl runner = - new TransactionRunnerImpl(session, Options.fromTransactionOptions()); + TransactionRunnerImpl runner = new TransactionRunnerImpl(session); runner.setSpan(mock(Span.class)); ExecuteBatchDmlResponse response1 = ExecuteBatchDmlResponse.newBuilder() From 51fb048de3aa12c5a1775eb339a1c3a6304d3864 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Wed, 3 Feb 2021 21:21:48 +0100 Subject: [PATCH 21/33] fix: address review comments --- .../ConnectionStatementExecutorImpl.java | 10 +-- .../cloud/spanner/connection/UnitOfWork.java | 6 +- .../cloud/spanner/CommitResponseTest.java | 18 +++++ .../connection/ConnectionImplTest.java | 47 ++++++++------ .../spanner/connection/DdlBatchTest.java | 14 ++++ .../connection/ReadOnlyTransactionTest.java | 20 ++++++ .../connection/ReadWriteTransactionTest.java | 37 +++++++++++ .../connection/SingleUseTransactionTest.java | 40 ++++++++++++ .../connection/it/ITCommitResponseTest.java | 65 ++++++++++--------- 9 files changed, 198 insertions(+), 59 deletions(-) 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 9a9cde1cfa8..1d7a202c5e9 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 @@ -184,9 +184,11 @@ public StatementResult statementShowCommitTimestamp() { @Override public StatementResult statementShowCommitResponse() { CommitResponse response = getConnection().getCommitResponseOrNull(); - CommitStats stats = - response == null || !response.hasCommitStats() ? null : response.getCommitStats(); - ResultSet rs = + CommitStats stats = null; + if (response != null && response.hasCommitStats()) { + stats = response.getCommitStats(); + } + ResultSet resultSet = ResultSets.forRows( Type.struct( StructField.of("COMMIT_TIMESTAMP", Type.timestamp()), @@ -198,7 +200,7 @@ public StatementResult statementShowCommitResponse() { .set("MUTATION_COUNT") .to(stats == null ? null : stats.getMutationCount()) .build())); - return StatementResultImpl.of(rs, SHOW_COMMIT_RESPONSE); + return StatementResultImpl.of(resultSet, SHOW_COMMIT_RESPONSE); } @Override 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 7255f7595cc..0d76d8587bc 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 @@ -144,14 +144,14 @@ ApiFuture executeQueryAsync( Timestamp getCommitTimestampOrNull(); /** - * @return the {@link CommitResponse} of this transaction. Will throw a {@link SpannerException} - * if there is no {@link CommitResponse}. + * @return the {@link CommitResponse} of this transaction. Throws a {@link SpannerException} if + * there is no {@link CommitResponse} */ CommitResponse getCommitResponse(); /** * @return the {@link CommitResponse} of this transaction or null if there is no {@link - * CommitResponse}. + * CommitResponse} */ CommitResponse getCommitResponseOrNull(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java index f106b38ff56..f2cb129b166 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java @@ -17,8 +17,11 @@ package com.google.cloud.spanner; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import com.google.cloud.Timestamp; +import com.google.spanner.v1.CommitResponse.CommitStats; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -75,4 +78,19 @@ public void testEqualsAndHashCode() { assertThat(response1.hashCode()).isNotEqualTo(response2.hashCode()); assertThat(response2.hashCode()).isNotEqualTo(response3.hashCode()); } + + @Test + public void testHasCommitStats() { + com.google.spanner.v1.CommitResponse protoWithoutCommitStats = + com.google.spanner.v1.CommitResponse.getDefaultInstance(); + CommitResponse responseWithoutCommitStats = new CommitResponse(protoWithoutCommitStats); + assertFalse(responseWithoutCommitStats.hasCommitStats()); + + com.google.spanner.v1.CommitResponse protoWithCommitStats = + com.google.spanner.v1.CommitResponse.newBuilder() + .setCommitStats(CommitStats.getDefaultInstance()) + .build(); + CommitResponse responseWithCommitStats = new CommitResponse(protoWithCommitStats); + assertTrue(responseWithCommitStats.hasCommitStats()); + } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java index 1b78d3245aa..c22833ca11f 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java @@ -24,6 +24,9 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +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.mockito.Matchers.any; import static org.mockito.Matchers.anyListOf; @@ -677,18 +680,20 @@ public void testExecuteGetReturnCommitStats() { .setCredentials(NoCredentials.getInstance()) .setUri(URI) .build())) { - assertThat(subject.isReturnCommitStats(), is(equalTo(false))); + assertFalse(subject.isReturnCommitStats()); - StatementResult res = subject.execute(Statement.of("show variable return_commit_stats")); - assertThat(res.getResultType(), is(equalTo(ResultType.RESULT_SET))); - assertThat(res.getResultSet().next(), is(true)); - assertThat(res.getResultSet().getBoolean("RETURN_COMMIT_STATS"), is(equalTo(false))); + StatementResult returnCommitStatsFalse = + subject.execute(Statement.of("show variable return_commit_stats")); + assertThat(returnCommitStatsFalse.getResultType(), is(equalTo(ResultType.RESULT_SET))); + assertTrue(returnCommitStatsFalse.getResultSet().next()); + assertFalse(returnCommitStatsFalse.getResultSet().getBoolean("RETURN_COMMIT_STATS")); subject.execute(Statement.of("set return_commit_stats=true")); - res = subject.execute(Statement.of("show variable return_commit_stats")); - assertThat(res.getResultType(), is(equalTo(ResultType.RESULT_SET))); - assertThat(res.getResultSet().next(), is(true)); - assertThat(res.getResultSet().getBoolean("RETURN_COMMIT_STATS"), is(equalTo(true))); + StatementResult returnCommitStatsTrue = + subject.execute(Statement.of("show variable return_commit_stats")); + assertThat(returnCommitStatsTrue.getResultType(), is(equalTo(ResultType.RESULT_SET))); + assertTrue(returnCommitStatsTrue.getResultSet().next()); + assertTrue(returnCommitStatsTrue.getResultSet().getBoolean("RETURN_COMMIT_STATS")); } } @@ -832,12 +837,12 @@ public void testExecuteGetCommitResponse() { subject.beginTransaction(); subject.executeQuery(Statement.of(AbstractConnectionImplTest.SELECT)).next(); subject.commit(); - StatementResult res = subject.execute(Statement.of("show variable commit_response")); - assertThat(res.getResultType(), is(equalTo(ResultType.RESULT_SET))); - assertThat(res.getResultSet().next(), is(true)); - assertThat(res.getResultSet().getTimestamp("COMMIT_TIMESTAMP"), is(notNullValue())); - assertThat(res.getResultSet().isNull("MUTATION_COUNT"), is(true)); - assertThat(res.getResultSet().next(), is(false)); + StatementResult response = subject.execute(Statement.of("show variable commit_response")); + assertThat(response.getResultType(), is(equalTo(ResultType.RESULT_SET))); + assertTrue(response.getResultSet().next()); + assertNotNull(response.getResultSet().getTimestamp("COMMIT_TIMESTAMP")); + assertTrue(response.getResultSet().isNull("MUTATION_COUNT")); + assertFalse(response.getResultSet().next()); } try (ConnectionImpl subject = @@ -849,12 +854,12 @@ public void testExecuteGetCommitResponse() { subject.beginTransaction(); subject.executeQuery(Statement.of(AbstractConnectionImplTest.SELECT)).next(); subject.commit(); - StatementResult res = subject.execute(Statement.of("show variable commit_response")); - assertThat(res.getResultType(), is(equalTo(ResultType.RESULT_SET))); - assertThat(res.getResultSet().next(), is(true)); - assertThat(res.getResultSet().getTimestamp("COMMIT_TIMESTAMP"), is(notNullValue())); - assertThat(res.getResultSet().isNull("MUTATION_COUNT"), is(false)); - assertThat(res.getResultSet().next(), is(false)); + StatementResult response = subject.execute(Statement.of("show variable commit_response")); + assertThat(response.getResultType(), is(equalTo(ResultType.RESULT_SET))); + assertTrue(response.getResultSet().next()); + assertNotNull(response.getResultSet().getTimestamp("COMMIT_TIMESTAMP")); + assertFalse(response.getResultSet().isNull("MUTATION_COUNT")); + assertFalse(response.getResultSet().next()); } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DdlBatchTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DdlBatchTest.java index 1e09eb70f50..9f57d84e7e1 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DdlBatchTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DdlBatchTest.java @@ -21,6 +21,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import static org.mockito.Matchers.anyListOf; import static org.mockito.Matchers.anyString; @@ -199,6 +200,19 @@ public void testGetCommitTimestamp() { } } + @Test + public void testGetCommitResponse() { + DdlBatch batch = createSubject(); + get(batch.runBatchAsync()); + try { + batch.getCommitResponse(); + fail("expected FAILED_PRECONDITION"); + } catch (SpannerException e) { + assertEquals(ErrorCode.FAILED_PRECONDITION, e.getErrorCode()); + } + assertNull(batch.getCommitResponseOrNull()); + } + @Test public void testGetReadTimestamp() { DdlBatch batch = createSubject(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadOnlyTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadOnlyTransactionTest.java index ad8b2849a1b..28d8b986029 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadOnlyTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadOnlyTransactionTest.java @@ -23,6 +23,7 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -249,6 +250,25 @@ public void testGetCommitTimestamp() { } } + @Test + public void testGetCommitResponse() { + ReadOnlyTransaction transaction = createSubject(); + get(transaction.commitAsync()); + try { + transaction.getCommitResponse(); + fail("expected FAILED_PRECONDITION"); + } catch (SpannerException e) { + assertEquals(ErrorCode.FAILED_PRECONDITION, e.getErrorCode()); + } + } + + @Test + public void testGetCommitResponseOrNull() { + ReadOnlyTransaction transaction = createSubject(); + get(transaction.commitAsync()); + assertNull(transaction.getCommitResponseOrNull()); + } + @Test public void testIsReadOnly() { assertThat(createSubject().isReadOnly(), is(true)); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadWriteTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadWriteTransactionTest.java index e6138e0f16b..12497c41985 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadWriteTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadWriteTransactionTest.java @@ -24,6 +24,8 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doThrow; @@ -678,4 +680,39 @@ public void testChecksumResultSetWithArray() { rs2.next(); assertThat(rs1.getChecksum(), is(not(equalTo(rs2.getChecksum())))); } + + @Test + public void testGetCommitResponseBeforeCommit() { + ParsedStatement parsedStatement = mock(ParsedStatement.class); + when(parsedStatement.getType()).thenReturn(StatementType.UPDATE); + when(parsedStatement.isUpdate()).thenReturn(true); + Statement statement = Statement.of("UPDATE FOO SET BAR=1 WHERE ID=2"); + when(parsedStatement.getStatement()).thenReturn(statement); + + ReadWriteTransaction transaction = createSubject(); + get(transaction.executeUpdateAsync(parsedStatement)); + try { + transaction.getCommitResponse(); + fail("Expected exception"); + } catch (SpannerException ex) { + assertEquals(ErrorCode.FAILED_PRECONDITION, ex.getErrorCode()); + } + assertNull(transaction.getCommitResponseOrNull()); + } + + @Test + public void testGetCommitResponseAfterCommit() { + ParsedStatement parsedStatement = mock(ParsedStatement.class); + when(parsedStatement.getType()).thenReturn(StatementType.UPDATE); + when(parsedStatement.isUpdate()).thenReturn(true); + Statement statement = Statement.of("UPDATE FOO SET BAR=1 WHERE ID=2"); + when(parsedStatement.getStatement()).thenReturn(statement); + + ReadWriteTransaction transaction = createSubject(); + get(transaction.executeUpdateAsync(parsedStatement)); + get(transaction.commitAsync()); + + assertNotNull(transaction.getCommitResponse()); + assertNotNull(transaction.getCommitResponseOrNull()); + } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java index 12ebf81e17c..8fe3c0f477f 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java @@ -18,6 +18,8 @@ import static com.google.cloud.spanner.SpannerApiFutures.get; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import static org.mockito.Matchers.anyListOf; import static org.mockito.Matchers.anyString; @@ -72,6 +74,7 @@ public class SingleUseTransactionTest { private static final String VALID_UPDATE = "UPDATE FOO SET BAR=1"; private static final String INVALID_UPDATE = "UPDATE BAR SET FOO=1"; private static final String SLOW_UPDATE = "UPDATE SLOW_TABLE SET FOO=1"; + private static final String VALID_DDL = "CREATE TABLE FOO"; private static final long VALID_UPDATE_COUNT = 99L; private final StatementExecutor executor = new StatementExecutor(); @@ -742,4 +745,41 @@ public void testMultiUse() { } catch (IllegalStateException e) { } } + + @Test + public void testGetCommitResponseAfterUpdate() { + ParsedStatement update = createParsedUpdate(VALID_UPDATE); + SingleUseTransaction transaction = createSubject(); + get(transaction.executeUpdateAsync(update)); + assertNotNull(transaction.getCommitResponse()); + assertNotNull(transaction.getCommitResponseOrNull()); + } + + @Test + public void testGetCommitResponseAfterQuery() { + ParsedStatement query = createParsedQuery(VALID_QUERY); + SingleUseTransaction transaction = createSubject(); + get(transaction.executeQueryAsync(query, AnalyzeMode.NONE)); + try { + transaction.getCommitResponse(); + fail("missing expected exception"); + } catch (SpannerException e) { + assertThat(e.getErrorCode()).isEqualTo(ErrorCode.FAILED_PRECONDITION); + } + assertNull(transaction.getCommitResponseOrNull()); + } + + @Test + public void testGetCommitResponseAfterDdl() { + ParsedStatement ddl = createParsedDdl(VALID_DDL); + SingleUseTransaction transaction = createSubject(); + get(transaction.executeDdlAsync(ddl)); + try { + transaction.getCommitResponse(); + fail("missing expected exception"); + } catch (SpannerException e) { + assertThat(e.getErrorCode()).isEqualTo(ErrorCode.FAILED_PRECONDITION); + } + assertNull(transaction.getCommitResponseOrNull()); + } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java index 51518652617..7e1d54b3300 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Google LLC + * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,9 @@ package com.google.cloud.spanner.connection.it; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import com.google.cloud.spanner.KeySet; import com.google.cloud.spanner.Mutation; @@ -57,9 +60,9 @@ public void testDefaultNoCommitStats() { connection.bufferedWrite( Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST").build()); connection.commit(); - assertThat(connection.getCommitResponse()).isNotNull(); - assertThat(connection.getCommitResponse().getCommitTimestamp()).isNotNull(); - assertThat(connection.getCommitResponse().hasCommitStats()).isFalse(); + assertNotNull(connection.getCommitResponse()); + assertNotNull(connection.getCommitResponse().getCommitTimestamp()); + assertFalse(connection.getCommitResponse().hasCommitStats()); } } @@ -70,9 +73,9 @@ public void testReturnCommitStats() { connection.bufferedWrite( Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST").build()); connection.commit(); - assertThat(connection.getCommitResponse()).isNotNull(); - assertThat(connection.getCommitResponse().getCommitTimestamp()).isNotNull(); - assertThat(connection.getCommitResponse().hasCommitStats()).isTrue(); + assertNotNull(connection.getCommitResponse()); + assertNotNull(connection.getCommitResponse().getCommitTimestamp()); + assertTrue(connection.getCommitResponse().hasCommitStats()); assertThat(connection.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); } } @@ -84,17 +87,17 @@ public void testReturnCommitStatsUsingSql() { connection.bufferedWrite( Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST").build()); connection.commit(); - assertThat(connection.getCommitResponse()).isNotNull(); - assertThat(connection.getCommitResponse().getCommitTimestamp()).isNotNull(); - assertThat(connection.getCommitResponse().hasCommitStats()).isTrue(); + assertNotNull(connection.getCommitResponse()); + assertNotNull(connection.getCommitResponse().getCommitTimestamp()); + assertTrue(connection.getCommitResponse().hasCommitStats()); assertThat(connection.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); - try (ResultSet rs = + try (ResultSet resultSet = connection.execute(Statement.of("SHOW VARIABLE COMMIT_RESPONSE")).getResultSet()) { - assertThat(rs.next()).isTrue(); - assertThat(rs.getTimestamp("COMMIT_TIMESTAMP")).isNotNull(); - assertThat(rs.getLong("MUTATION_COUNT")).isEqualTo(2L); - assertThat(rs.getString("OVERLOAD_DELAY")).isNotNull(); - assertThat(rs.next()).isFalse(); + assertTrue(resultSet.next()); + assertNotNull(resultSet.getTimestamp("COMMIT_TIMESTAMP")); + assertThat(resultSet.getLong("MUTATION_COUNT")).isEqualTo(2L); + assertNotNull(resultSet.getString("OVERLOAD_DELAY")); + assertFalse(resultSet.next()); } } } @@ -105,9 +108,9 @@ public void testAutocommitDefaultNoCommitStats() { connection.setAutocommit(true); connection.write( Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST").build()); - assertThat(connection.getCommitResponse()).isNotNull(); - assertThat(connection.getCommitResponse().getCommitTimestamp()).isNotNull(); - assertThat(connection.getCommitResponse().hasCommitStats()).isFalse(); + assertNotNull(connection.getCommitResponse()); + assertNotNull(connection.getCommitResponse().getCommitTimestamp()); + assertFalse(connection.getCommitResponse().hasCommitStats()); } } @@ -118,9 +121,9 @@ public void testAutocommitReturnCommitStats() { connection.setReturnCommitStats(true); connection.write( Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST").build()); - assertThat(connection.getCommitResponse()).isNotNull(); - assertThat(connection.getCommitResponse().getCommitTimestamp()).isNotNull(); - assertThat(connection.getCommitResponse().hasCommitStats()).isTrue(); + assertNotNull(connection.getCommitResponse()); + assertNotNull(connection.getCommitResponse().getCommitTimestamp()); + assertTrue(connection.getCommitResponse().hasCommitStats()); assertThat(connection.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); } } @@ -132,17 +135,17 @@ public void testAutocommitReturnCommitStatsUsingSql() { connection.execute(Statement.of("SET RETURN_COMMIT_STATS=TRUE")); connection.write( Mutation.newInsertBuilder("TEST").set("ID").to(1L).set("NAME").to("TEST").build()); - assertThat(connection.getCommitResponse()).isNotNull(); - assertThat(connection.getCommitResponse().getCommitTimestamp()).isNotNull(); - assertThat(connection.getCommitResponse().hasCommitStats()).isTrue(); + assertNotNull(connection.getCommitResponse()); + assertNotNull(connection.getCommitResponse().getCommitTimestamp()); + assertTrue(connection.getCommitResponse().hasCommitStats()); assertThat(connection.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); - try (ResultSet rs = + try (ResultSet resultSet = connection.execute(Statement.of("SHOW VARIABLE COMMIT_RESPONSE")).getResultSet()) { - assertThat(rs.next()).isTrue(); - assertThat(rs.getTimestamp("COMMIT_TIMESTAMP")).isNotNull(); - assertThat(rs.getLong("MUTATION_COUNT")).isEqualTo(2L); - assertThat(rs.getString("OVERLOAD_DELAY")).isNotNull(); - assertThat(rs.next()).isFalse(); + assertTrue(resultSet.next()); + assertNotNull(resultSet.getTimestamp("COMMIT_TIMESTAMP")); + assertThat(resultSet.getLong("MUTATION_COUNT")).isEqualTo(2L); + assertNotNull(resultSet.getString("OVERLOAD_DELAY")); + assertFalse(resultSet.next()); } } } From 66c5f88b55836abf4912e1031e504ef5d2abe9c3 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Thu, 4 Feb 2021 08:41:12 +0100 Subject: [PATCH 22/33] chore: replace truth asserts with junit asserts --- .../spanner/AsyncTransactionManagerTest.java | 7 +++-- .../cloud/spanner/CommitResponseTest.java | 5 ++-- .../cloud/spanner/DatabaseClientImplTest.java | 28 ++++++++++--------- .../com/google/cloud/spanner/OptionsTest.java | 8 ++++-- .../cloud/spanner/it/ITAsyncAPITest.java | 5 ++-- .../spanner/it/ITTransactionManagerTest.java | 2 +- .../google/cloud/spanner/it/ITWriteTest.java | 12 ++++---- 7 files changed, 37 insertions(+), 30 deletions(-) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java index e35c8c7be97..0119b5a2008 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java @@ -23,6 +23,7 @@ import static com.google.cloud.spanner.MockSpannerTestUtil.UPDATE_COUNT; import static com.google.cloud.spanner.MockSpannerTestUtil.UPDATE_STATEMENT; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import com.google.api.core.ApiFuture; @@ -226,9 +227,9 @@ public void asyncTransactionManager_returnsCommitStats() throws Exception { Mutation.delete("FOO", Key.of("foo"))), executor) .commitAsync(); - assertThat(commitTimestamp.get()).isNotNull(); - assertThat(manager.getCommitResponse().get()).isNotNull(); - assertThat(manager.getCommitResponse().get().getCommitStats()).isNotNull(); + assertNotNull(commitTimestamp.get()); + assertNotNull(manager.getCommitResponse().get()); + assertNotNull(manager.getCommitResponse().get().getCommitStats()); assertThat(manager.getCommitResponse().get().getCommitStats().getMutationCount()) .isEqualTo(1); break; diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java index f106b38ff56..e65f57ea814 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java @@ -17,6 +17,7 @@ package com.google.cloud.spanner; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertFalse; import com.google.cloud.Timestamp; import org.junit.Test; @@ -68,8 +69,8 @@ public void testEqualsAndHashCode() { assertThat(response1).isEqualTo(response3); assertThat(response1).isNotEqualTo(response2); assertThat(response2).isNotEqualTo(response3); - assertThat(response1.equals(null)).isFalse(); - assertThat(response1.equals(new Object())).isFalse(); + assertFalse(response1.equals(null)); + assertFalse(response1.equals(new Object())); assertThat(response1.hashCode()).isEqualTo(response3.hashCode()); assertThat(response1.hashCode()).isNotEqualTo(response2.hashCode()); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java index 08c0a0eb7ba..5064d459ef9 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java @@ -19,6 +19,8 @@ import static com.google.cloud.spanner.MockSpannerTestUtil.SELECT1; import static com.google.cloud.spanner.SpannerApiFutures.get; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -173,9 +175,9 @@ public void writeWithCommitStats() { Arrays.asList( Mutation.newInsertBuilder("FOO").set("ID").to(1L).set("NAME").to("Bar").build()), Options.commitStats()); - assertThat(response).isNotNull(); - assertThat(response.getCommitTimestamp()).isNotNull(); - assertThat(response.getCommitStats()).isNotNull(); + assertNotNull(response); + assertNotNull(response.getCommitTimestamp()); + assertNotNull(response.getCommitStats()); } @Test @@ -196,9 +198,9 @@ public void writeAtLeastOnceWithCommitStats() { Arrays.asList( Mutation.newInsertBuilder("FOO").set("ID").to(1L).set("NAME").to("Bar").build()), Options.commitStats()); - assertThat(response).isNotNull(); - assertThat(response.getCommitTimestamp()).isNotNull(); - assertThat(response.getCommitStats()).isNotNull(); + assertNotNull(response); + assertNotNull(response.getCommitTimestamp()); + assertNotNull(response.getCommitStats()); } @Test @@ -482,8 +484,8 @@ public Void run(TransactionContext transaction) throws Exception { return null; } }); - assertThat(runner.getCommitResponse()).isNotNull(); - assertThat(runner.getCommitResponse().getCommitStats()).isNotNull(); + assertNotNull(runner.getCommitResponse()); + assertNotNull(runner.getCommitResponse().getCommitStats()); assertThat(runner.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(1); } @@ -542,9 +544,9 @@ public ApiFuture doWorkAsync(TransactionContext txn) { } }, executor); - assertThat(get(fut)).isNull(); - assertThat(get(runner.getCommitResponse())).isNotNull(); - assertThat(get(runner.getCommitResponse()).getCommitStats()).isNotNull(); + assertNull(get(fut)); + assertNotNull(get(runner.getCommitResponse())); + assertNotNull(get(runner.getCommitResponse()).getCommitStats()); assertThat(get(runner.getCommitResponse()).getCommitStats().getMutationCount()).isEqualTo(1); executor.shutdown(); } @@ -626,8 +628,8 @@ public void transactionManager_returnsCommitStats() throws InterruptedException try { tx.buffer(Mutation.delete("FOO", Key.of("foo"))); txManager.commit(); - assertThat(txManager.getCommitResponse()).isNotNull(); - assertThat(txManager.getCommitResponse().getCommitStats()).isNotNull(); + assertNotNull(txManager.getCommitResponse()); + assertNotNull(txManager.getCommitResponse().getCommitStats()); assertThat(txManager.getCommitResponse().getCommitStats().getMutationCount()) .isEqualTo(1); break; diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java index 725db5bf546..bf83be84a4f 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java @@ -17,7 +17,9 @@ package com.google.cloud.spanner; import static com.google.common.truth.Truth.assertThat; +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 org.junit.Test; @@ -236,21 +238,21 @@ public void testFromTransactionOptions_toStringWithCommitStats() { public void testTransactionOptions_noOptionsAreEqual() { Options o1 = Options.fromTransactionOptions(); Options o2 = Options.fromTransactionOptions(); - assertThat(o1.equals(o2)).isTrue(); + assertTrue(o1.equals(o2)); } @Test public void testTransactionOptions_withCommitStatsAreEqual() { Options o1 = Options.fromTransactionOptions(Options.commitStats()); Options o2 = Options.fromTransactionOptions(Options.commitStats()); - assertThat(o1.equals(o2)).isTrue(); + assertTrue(o1.equals(o2)); } @Test public void testTransactionOptions_withCommitStatsAndOtherOptionAreNotEqual() { Options o1 = Options.fromTransactionOptions(Options.commitStats()); Options o2 = Options.fromQueryOptions(Options.prefetchChunks(10)); - assertThat(o1.equals(o2)).isFalse(); + assertFalse(o1.equals(o2)); } @Test diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java index c9475c19f48..5bda784e737 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java @@ -19,6 +19,7 @@ import static com.google.cloud.spanner.SpannerApiFutures.get; import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; @@ -336,7 +337,7 @@ public ApiFuture doWorkAsync(TransactionContext txn) { } }, executor); - assertThat(get(runner.getCommitResponse()).getCommitStats()).isNotNull(); + assertNotNull(get(runner.getCommitResponse()).getCommitStats()); // MutationCount = 2 columns + 2 secondary indexes. assertThat(get(runner.getCommitResponse()).getCommitStats().getMutationCount()).isEqualTo(4L); } @@ -367,7 +368,7 @@ public ApiFuture apply(TransactionContext txn, Void input) }, executor) .commitAsync()); - assertThat(get(mgr.getCommitResponse()).getCommitStats()).isNotNull(); + assertNotNull(get(mgr.getCommitResponse()).getCommitStats()); assertThat(get(mgr.getCommitResponse()).getCommitStats().getMutationCount()) .isEqualTo(4L); break; diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java index 3039185ae5d..b434b4b1b8a 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java @@ -230,7 +230,7 @@ public void transactionManagerReturnsCommitStats() throws InterruptedException { .build()); try { manager.commit(); - assertThat(manager.getCommitResponse().getCommitStats()).isNotNull(); + assertNotNull(manager.getCommitResponse().getCommitStats()); assertThat(manager.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); break; } catch (AbortedException e) { diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java index a4c0392cbd7..80cc6700fb0 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java @@ -173,9 +173,9 @@ public void writeReturnsCommitStats() { .to("v1") .build()), Options.commitStats()); - assertThat(response).isNotNull(); - assertThat(response.getCommitTimestamp()).isNotNull(); - assertThat(response.getCommitStats()).isNotNull(); + assertNotNull(response); + assertNotNull(response.getCommitTimestamp()); + assertNotNull(response.getCommitStats()); assertThat(response.getCommitStats().getMutationCount()).isEqualTo(2L); } @@ -192,9 +192,9 @@ public void writeAtLeastOnceReturnsCommitStats() { .to("v1") .build()), Options.commitStats()); - assertThat(response).isNotNull(); - assertThat(response.getCommitTimestamp()).isNotNull(); - assertThat(response.getCommitStats()).isNotNull(); + assertNotNull(response); + assertNotNull(response.getCommitTimestamp()); + assertNotNull(response.getCommitStats()); assertThat(response.getCommitStats().getMutationCount()).isEqualTo(2L); } From b351d08d7567bc2a84213f1106b7e7f7fa56886e Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Thu, 4 Feb 2021 09:00:52 +0100 Subject: [PATCH 23/33] test: skip CommitStats integration tests on emulator --- .../cloud/spanner/connection/it/ITCommitResponseTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java index 7e1d54b3300..11e92a3ccbf 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java @@ -16,10 +16,12 @@ package com.google.cloud.spanner.connection.it; +import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeFalse; import com.google.cloud.spanner.KeySet; import com.google.cloud.spanner.Mutation; @@ -68,6 +70,7 @@ public void testDefaultNoCommitStats() { @Test public void testReturnCommitStats() { + assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); try (ITConnection connection = createConnection()) { connection.setReturnCommitStats(true); connection.bufferedWrite( @@ -82,6 +85,7 @@ public void testReturnCommitStats() { @Test public void testReturnCommitStatsUsingSql() { + assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); try (ITConnection connection = createConnection()) { connection.execute(Statement.of("SET RETURN_COMMIT_STATS=TRUE")); connection.bufferedWrite( @@ -116,6 +120,7 @@ public void testAutocommitDefaultNoCommitStats() { @Test public void testAutocommitReturnCommitStats() { + assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); try (ITConnection connection = createConnection()) { connection.setAutocommit(true); connection.setReturnCommitStats(true); @@ -130,6 +135,7 @@ public void testAutocommitReturnCommitStats() { @Test public void testAutocommitReturnCommitStatsUsingSql() { + assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); try (ITConnection connection = createConnection()) { connection.execute(Statement.of("SET AUTOCOMMIT=TRUE")); connection.execute(Statement.of("SET RETURN_COMMIT_STATS=TRUE")); From da0e434392ce03abb9f5a9317f544c59f11cbe8d Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Thu, 4 Feb 2021 18:38:43 +0100 Subject: [PATCH 24/33] fix: address review comments --- .../google/cloud/spanner/CommitResponse.java | 2 +- .../cloud/spanner/connection/Connection.java | 26 +++++++++---------- .../spanner/connection/ConnectionOptions.java | 2 +- .../connection/ConnectionImplTest.java | 19 +++++++------- 4 files changed, 25 insertions(+), 24 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java index 584437032c8..896cf6bbfb8 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java @@ -41,7 +41,7 @@ public Timestamp getCommitTimestamp() { return Timestamp.fromProto(proto.getCommitTimestamp()); } - /** @return true if the {@link CommitResponse} includes {@link CommitStats}. */ + /** @return true if the {@link CommitResponse} includes {@link CommitStats} */ public boolean hasCommitStats() { return proto.hasCommitStats(); } 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 196b66024fd..bd1214d6a19 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 @@ -445,7 +445,7 @@ public interface Connection extends AutoCloseable { */ void setReturnCommitStats(boolean returnCommitStats); - /** @return true if this connection requests commit statistics from Cloud Spanner. */ + /** @return true if this connection requests commit statistics from Cloud Spanner */ boolean isReturnCommitStats(); /** @@ -633,23 +633,23 @@ public interface Connection extends AutoCloseable { /** * @return the commit timestamp of the last {@link TransactionMode#READ_WRITE_TRANSACTION} - * transaction. This method will throw a {@link SpannerException} if there is no last {@link - * TransactionMode#READ_WRITE_TRANSACTION} transaction (i.e. the last transaction was a {@link - * TransactionMode#READ_ONLY_TRANSACTION}), or if the last {@link - * TransactionMode#READ_WRITE_TRANSACTION} transaction rolled back. It will also throw a - * {@link SpannerException} if the last {@link TransactionMode#READ_WRITE_TRANSACTION} - * transaction was empty when committed. + * transaction. This method throws a {@link SpannerException} if there is no last {@link + * TransactionMode#READ_WRITE_TRANSACTION} transaction. That is, if the last transaction was a + * {@link TransactionMode#READ_ONLY_TRANSACTION}), or if the last {@link + * TransactionMode#READ_WRITE_TRANSACTION} transaction rolled back. It also throws a {@link + * SpannerException} if the last {@link TransactionMode#READ_WRITE_TRANSACTION} transaction + * was empty when committed. */ Timestamp getCommitTimestamp(); /** * @return the {@link CommitResponse} of the last {@link TransactionMode#READ_WRITE_TRANSACTION} - * transaction. This method will throw a {@link SpannerException} if there is no last {@link - * TransactionMode#READ_WRITE_TRANSACTION} transaction (i.e. the last transaction was a {@link - * TransactionMode#READ_ONLY_TRANSACTION}), or if the last {@link - * TransactionMode#READ_WRITE_TRANSACTION} transaction rolled back. It will also throw a - * {@link SpannerException} if the last {@link TransactionMode#READ_WRITE_TRANSACTION} - * transaction was empty when committed. + * transaction. This method throws a {@link SpannerException} if there is no last {@link + * TransactionMode#READ_WRITE_TRANSACTION} transaction. That is, if the last transaction was a + * {@link TransactionMode#READ_ONLY_TRANSACTION}), or if the last {@link + * TransactionMode#READ_WRITE_TRANSACTION} transaction rolled back. It also throws a {@link + * SpannerException} if the last {@link TransactionMode#READ_WRITE_TRANSACTION} transaction + * was empty when committed. */ CommitResponse getCommitResponse(); diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java index 330b5edb7d8..b4bea4363bc 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java @@ -185,7 +185,7 @@ public String[] getValidValues() { private static final String USER_AGENT_PROPERTY_NAME = "userAgent"; /** Query optimizer version to use for a connection. */ private static final String OPTIMIZER_VERSION_PROPERTY_NAME = "optimizerVersion"; - /** Query optimizer version to use for a connection. */ + /** Return commit stats for read/write transactions. */ private static final String RETURN_COMMIT_STATS_PROPERTY_NAME = "returnCommitStats"; /** Name of the 'lenientMode' connection property. */ public static final String LENIENT_PROPERTY_NAME = "lenient"; diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java index c22833ca11f..ce099a5946a 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java @@ -24,6 +24,7 @@ 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; @@ -641,15 +642,15 @@ public void testExecuteSetReturnCommitStats() { .setCredentials(NoCredentials.getInstance()) .setUri(URI) .build())) { - assertThat(subject.isReturnCommitStats(), is(equalTo(false))); + assertFalse(subject.isReturnCommitStats()); - StatementResult res = subject.execute(Statement.of("set return_commit_stats=true")); - assertThat(res.getResultType(), is(equalTo(ResultType.NO_RESULT))); - assertThat(subject.isReturnCommitStats(), is(equalTo(true))); + StatementResult result = subject.execute(Statement.of("set return_commit_stats=true")); + assertThat(result.getResultType(), is(equalTo(ResultType.NO_RESULT))); + assertTrue(subject.isReturnCommitStats()); - res = subject.execute(Statement.of("set return_commit_stats=false")); - assertThat(res.getResultType(), is(equalTo(ResultType.NO_RESULT))); - assertThat(subject.isReturnCommitStats(), is(equalTo(false))); + result = subject.execute(Statement.of("set return_commit_stats=false")); + assertThat(result.getResultType(), is(equalTo(ResultType.NO_RESULT))); + assertFalse(subject.isReturnCommitStats()); } } @@ -661,13 +662,13 @@ public void testExecuteSetReturnCommitStatsInvalidValue() { .setCredentials(NoCredentials.getInstance()) .setUri(URI) .build())) { - assertThat(subject.isReturnCommitStats(), is(equalTo(false))); + assertFalse(subject.isReturnCommitStats()); try { subject.execute(Statement.of("set return_commit_stats=yes")); fail("Missing expected exception"); } catch (SpannerException e) { - assertThat(e.getErrorCode(), is(equalTo(ErrorCode.INVALID_ARGUMENT))); + assertEquals(e.getErrorCode(), ErrorCode.INVALID_ARGUMENT); } } } From 1d17973b81e2903cbab466b7a3bb6e577f707c8b Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Fri, 5 Feb 2021 15:49:22 +0100 Subject: [PATCH 25/33] chore: replace truth assertions with junit --- .../com/google/cloud/spanner/Options.java | 2 +- .../cloud/spanner/TransactionManagerImpl.java | 1 + .../spanner/AsyncTransactionManagerTest.java | 4 ++-- .../cloud/spanner/CommitResponseTest.java | 19 ++++++++++--------- .../cloud/spanner/DatabaseClientImplTest.java | 8 ++++---- .../com/google/cloud/spanner/OptionsTest.java | 8 +++++--- .../cloud/spanner/it/ITAsyncAPITest.java | 6 +++--- .../spanner/it/ITTransactionManagerTest.java | 3 ++- .../cloud/spanner/it/ITTransactionTest.java | 3 ++- .../google/cloud/spanner/it/ITWriteTest.java | 5 +++-- 10 files changed, 33 insertions(+), 26 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java index 7c0eab2cdb4..38932bf8a80 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java @@ -46,7 +46,7 @@ public interface UpdateOption {} /** Marker interface to mark options applicable to list operations in admin API. */ public interface ListOption {} - /** Specifying this will cause the transaction to request {@link CommitStats} from the backend. */ + /** Specifying this instructs the transaction to request {@link CommitStats} from the backend. */ public static TransactionOption commitStats() { return COMMIT_STATS_OPTION; } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManagerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManagerImpl.java index c40881572be..2d47fcd5c78 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManagerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionManagerImpl.java @@ -121,6 +121,7 @@ public Timestamp getCommitTimestamp() { return txn.getCommitResponse().getCommitTimestamp(); } + @Override public CommitResponse getCommitResponse() { Preconditions.checkState( txnState == TransactionState.COMMITTED, diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java index 0119b5a2008..1740aa02437 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java @@ -23,6 +23,7 @@ import static com.google.cloud.spanner.MockSpannerTestUtil.UPDATE_COUNT; import static com.google.cloud.spanner.MockSpannerTestUtil.UPDATE_STATEMENT; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; @@ -230,8 +231,7 @@ public void asyncTransactionManager_returnsCommitStats() throws Exception { assertNotNull(commitTimestamp.get()); assertNotNull(manager.getCommitResponse().get()); assertNotNull(manager.getCommitResponse().get().getCommitStats()); - assertThat(manager.getCommitResponse().get().getCommitStats().getMutationCount()) - .isEqualTo(1); + assertEquals(1L, manager.getCommitResponse().get().getCommitStats().getMutationCount()); break; } catch (AbortedException e) { txn = manager.resetForRetryAsync(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java index e65f57ea814..16c498392db 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java @@ -16,8 +16,9 @@ package com.google.cloud.spanner; -import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import com.google.cloud.Timestamp; import org.junit.Test; @@ -43,8 +44,8 @@ public void testFromProto() { CommitResponse response = new CommitResponse(proto); - assertThat(response.getCommitTimestamp()).isEqualTo(Timestamp.ofTimeSecondsAndNanos(123L, 456)); - assertThat(response.getCommitStats().getMutationCount()).isEqualTo(mutationCount); + assertEquals(Timestamp.ofTimeSecondsAndNanos(123L, 456), response.getCommitTimestamp()); + assertEquals(mutationCount, response.getCommitStats().getMutationCount()); } @Test @@ -66,14 +67,14 @@ public void testEqualsAndHashCode() { CommitResponse response2 = new CommitResponse(proto2); CommitResponse response3 = new CommitResponse(proto3); - assertThat(response1).isEqualTo(response3); - assertThat(response1).isNotEqualTo(response2); - assertThat(response2).isNotEqualTo(response3); + assertEquals(response3, response1); + assertNotEquals(response2, response1); + assertNotEquals(response3, response2); assertFalse(response1.equals(null)); assertFalse(response1.equals(new Object())); - assertThat(response1.hashCode()).isEqualTo(response3.hashCode()); - assertThat(response1.hashCode()).isNotEqualTo(response2.hashCode()); - assertThat(response2.hashCode()).isNotEqualTo(response3.hashCode()); + assertEquals(response3.hashCode(), response1.hashCode()); + assertNotEquals(response2.hashCode(), response1.hashCode()); + assertNotEquals(response3.hashCode(), response2.hashCode()); } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java index 5064d459ef9..dfe8867b96a 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java @@ -19,6 +19,7 @@ import static com.google.cloud.spanner.MockSpannerTestUtil.SELECT1; import static com.google.cloud.spanner.SpannerApiFutures.get; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; @@ -486,7 +487,7 @@ public Void run(TransactionContext transaction) throws Exception { }); assertNotNull(runner.getCommitResponse()); assertNotNull(runner.getCommitResponse().getCommitStats()); - assertThat(runner.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(1); + assertEquals(1L, runner.getCommitResponse().getCommitStats().getMutationCount()); } @Test @@ -547,7 +548,7 @@ public ApiFuture doWorkAsync(TransactionContext txn) { assertNull(get(fut)); assertNotNull(get(runner.getCommitResponse())); assertNotNull(get(runner.getCommitResponse()).getCommitStats()); - assertThat(get(runner.getCommitResponse()).getCommitStats().getMutationCount()).isEqualTo(1); + assertEquals(1L, get(runner.getCommitResponse()).getCommitStats().getMutationCount()); executor.shutdown(); } @@ -630,8 +631,7 @@ public void transactionManager_returnsCommitStats() throws InterruptedException txManager.commit(); assertNotNull(txManager.getCommitResponse()); assertNotNull(txManager.getCommitResponse().getCommitStats()); - assertThat(txManager.getCommitResponse().getCommitStats().getMutationCount()) - .isEqualTo(1); + assertEquals(1L, txManager.getCommitResponse().getCommitStats().getMutationCount()); break; } catch (AbortedException e) { Thread.sleep(e.getRetryDelayInMillis() / 1000); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java index bf83be84a4f..28d53de3299 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java @@ -17,7 +17,9 @@ package com.google.cloud.spanner; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -259,21 +261,21 @@ public void testTransactionOptions_withCommitStatsAndOtherOptionAreNotEqual() { public void testTransactionOptions_noOptionsHashCode() { Options o1 = Options.fromTransactionOptions(); Options o2 = Options.fromTransactionOptions(); - assertThat(o1.hashCode()).isEqualTo(o2.hashCode()); + assertEquals(o2.hashCode(), o1.hashCode()); } @Test public void testTransactionOptions_withCommitStatsHashCode() { Options o1 = Options.fromTransactionOptions(Options.commitStats()); Options o2 = Options.fromTransactionOptions(Options.commitStats()); - assertThat(o1.hashCode()).isEqualTo(o2.hashCode()); + assertEquals(o2.hashCode(), o1.hashCode()); } @Test public void testTransactionOptions_withCommitStatsAndOtherOptionHashCode() { Options o1 = Options.fromTransactionOptions(Options.commitStats()); Options o2 = Options.fromQueryOptions(Options.prefetchChunks(10)); - assertThat(o1.hashCode()).isNotEqualTo(o2.hashCode()); + assertNotEquals(o2.hashCode(), o1.hashCode()); } @Test diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java index 5bda784e737..0c6aa579822 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java @@ -19,6 +19,7 @@ import static com.google.cloud.spanner.SpannerApiFutures.get; import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; @@ -339,7 +340,7 @@ public ApiFuture doWorkAsync(TransactionContext txn) { executor); assertNotNull(get(runner.getCommitResponse()).getCommitStats()); // MutationCount = 2 columns + 2 secondary indexes. - assertThat(get(runner.getCommitResponse()).getCommitStats().getMutationCount()).isEqualTo(4L); + assertEquals(4L, get(runner.getCommitResponse()).getCommitStats().getMutationCount()); } @Test @@ -369,8 +370,7 @@ public ApiFuture apply(TransactionContext txn, Void input) executor) .commitAsync()); assertNotNull(get(mgr.getCommitResponse()).getCommitStats()); - assertThat(get(mgr.getCommitResponse()).getCommitStats().getMutationCount()) - .isEqualTo(4L); + assertEquals(4L, get(mgr.getCommitResponse()).getCommitStats().getMutationCount()); break; } catch (AbortedException e) { Thread.sleep(e.getRetryDelayInMillis() / 1000); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java index b434b4b1b8a..fb5d374e854 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java @@ -18,6 +18,7 @@ import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; @@ -231,7 +232,7 @@ public void transactionManagerReturnsCommitStats() throws InterruptedException { try { manager.commit(); assertNotNull(manager.getCommitResponse().getCommitStats()); - assertThat(manager.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); + assertEquals(2L, manager.getCommitResponse().getCommitStats().getMutationCount()); break; } catch (AbortedException e) { Thread.sleep(e.getRetryDelayInMillis() / 1000); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java index 8532fd77c5a..ade9129d03a 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java @@ -19,6 +19,7 @@ import static com.google.cloud.spanner.SpannerExceptionFactory.newSpannerException; import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; @@ -649,6 +650,6 @@ public Void run(TransactionContext transaction) throws Exception { }); assertNotNull(runner.getCommitResponse().getCommitStats()); // MutationCount = 2 (2 columns). - assertThat(runner.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); + assertEquals(2L, runner.getCommitResponse().getCommitStats().getMutationCount()); } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java index 80cc6700fb0..5d288d4ed64 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java @@ -19,6 +19,7 @@ import static com.google.cloud.spanner.SpannerMatchers.isSpannerException; import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; @@ -176,7 +177,7 @@ public void writeReturnsCommitStats() { assertNotNull(response); assertNotNull(response.getCommitTimestamp()); assertNotNull(response.getCommitStats()); - assertThat(response.getCommitStats().getMutationCount()).isEqualTo(2L); + assertEquals(2L, response.getCommitStats().getMutationCount()); } @Test @@ -195,7 +196,7 @@ public void writeAtLeastOnceReturnsCommitStats() { assertNotNull(response); assertNotNull(response.getCommitTimestamp()); assertNotNull(response.getCommitStats()); - assertThat(response.getCommitStats().getMutationCount()).isEqualTo(2L); + assertEquals(2L, response.getCommitStats().getMutationCount()); } @Test From c01152d9a25c590a13928bb60495ce245c437921 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Fri, 5 Feb 2021 16:10:07 +0100 Subject: [PATCH 26/33] test: add additional tests + replace truth with junit assertions --- .../cloud/spanner/connection/UnitOfWork.java | 4 ++-- .../cloud/spanner/CommitResponseTest.java | 2 +- .../spanner/connection/DmlBatchTest.java | 20 +++++++++++++++++++ .../connection/SingleUseTransactionTest.java | 5 +++-- .../connection/it/ITCommitResponseTest.java | 14 ++++++------- 5 files changed, 33 insertions(+), 12 deletions(-) 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 0d76d8587bc..f1b218c751f 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 @@ -144,8 +144,8 @@ ApiFuture executeQueryAsync( Timestamp getCommitTimestampOrNull(); /** - * @return the {@link CommitResponse} of this transaction. Throws a {@link SpannerException} if - * there is no {@link CommitResponse} + * @return the {@link CommitResponse} of this transaction + * @throws {@link SpannerException} if there is no {@link CommitResponse} */ CommitResponse getCommitResponse(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java index ce39d8431be..dccf1cae69a 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java @@ -18,8 +18,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; import com.google.cloud.Timestamp; import com.google.spanner.v1.CommitResponse.CommitStats; diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DmlBatchTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DmlBatchTest.java index 0f1ca38cd7f..4bb4ba99ca9 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DmlBatchTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DmlBatchTest.java @@ -20,6 +20,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import static org.mockito.Matchers.anyListOf; import static org.mockito.Mockito.mock; @@ -112,6 +113,25 @@ public void testGetCommitTimestamp() { } } + @Test + public void testGetCommitResponse() { + DmlBatch batch = createSubject(); + get(batch.runBatchAsync()); + try { + batch.getCommitResponse(); + fail("Expected exception"); + } catch (SpannerException e) { + assertEquals(ErrorCode.FAILED_PRECONDITION, e.getErrorCode()); + } + } + + @Test + public void testGetCommitResponseOrNull() { + DmlBatch batch = createSubject(); + get(batch.runBatchAsync()); + assertNull(batch.getCommitResponseOrNull()); + } + @Test public void testWriteIterable() { DmlBatch batch = createSubject(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java index 8fe3c0f477f..0954a01e4df 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java @@ -18,6 +18,7 @@ import static com.google.cloud.spanner.SpannerApiFutures.get; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; @@ -764,7 +765,7 @@ public void testGetCommitResponseAfterQuery() { transaction.getCommitResponse(); fail("missing expected exception"); } catch (SpannerException e) { - assertThat(e.getErrorCode()).isEqualTo(ErrorCode.FAILED_PRECONDITION); + assertEquals(ErrorCode.INVALID_ARGUMENT, e.getErrorCode()); } assertNull(transaction.getCommitResponseOrNull()); } @@ -778,7 +779,7 @@ public void testGetCommitResponseAfterDdl() { transaction.getCommitResponse(); fail("missing expected exception"); } catch (SpannerException e) { - assertThat(e.getErrorCode()).isEqualTo(ErrorCode.FAILED_PRECONDITION); + assertEquals(ErrorCode.INVALID_ARGUMENT, e.getErrorCode()); } assertNull(transaction.getCommitResponseOrNull()); } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java index 11e92a3ccbf..9850555ae49 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java @@ -17,7 +17,7 @@ package com.google.cloud.spanner.connection.it; import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; -import static com.google.common.truth.Truth.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; @@ -79,7 +79,7 @@ public void testReturnCommitStats() { assertNotNull(connection.getCommitResponse()); assertNotNull(connection.getCommitResponse().getCommitTimestamp()); assertTrue(connection.getCommitResponse().hasCommitStats()); - assertThat(connection.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); + assertEquals(2L, connection.getCommitResponse().getCommitStats().getMutationCount()); } } @@ -94,12 +94,12 @@ public void testReturnCommitStatsUsingSql() { assertNotNull(connection.getCommitResponse()); assertNotNull(connection.getCommitResponse().getCommitTimestamp()); assertTrue(connection.getCommitResponse().hasCommitStats()); - assertThat(connection.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); + assertEquals(2L, connection.getCommitResponse().getCommitStats().getMutationCount()); try (ResultSet resultSet = connection.execute(Statement.of("SHOW VARIABLE COMMIT_RESPONSE")).getResultSet()) { assertTrue(resultSet.next()); assertNotNull(resultSet.getTimestamp("COMMIT_TIMESTAMP")); - assertThat(resultSet.getLong("MUTATION_COUNT")).isEqualTo(2L); + assertEquals(2L, resultSet.getLong("MUTATION_COUNT")); assertNotNull(resultSet.getString("OVERLOAD_DELAY")); assertFalse(resultSet.next()); } @@ -129,7 +129,7 @@ public void testAutocommitReturnCommitStats() { assertNotNull(connection.getCommitResponse()); assertNotNull(connection.getCommitResponse().getCommitTimestamp()); assertTrue(connection.getCommitResponse().hasCommitStats()); - assertThat(connection.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); + assertEquals(2L, connection.getCommitResponse().getCommitStats().getMutationCount()); } } @@ -144,12 +144,12 @@ public void testAutocommitReturnCommitStatsUsingSql() { assertNotNull(connection.getCommitResponse()); assertNotNull(connection.getCommitResponse().getCommitTimestamp()); assertTrue(connection.getCommitResponse().hasCommitStats()); - assertThat(connection.getCommitResponse().getCommitStats().getMutationCount()).isEqualTo(2L); + assertEquals(2L, connection.getCommitResponse().getCommitStats().getMutationCount()); try (ResultSet resultSet = connection.execute(Statement.of("SHOW VARIABLE COMMIT_RESPONSE")).getResultSet()) { assertTrue(resultSet.next()); assertNotNull(resultSet.getTimestamp("COMMIT_TIMESTAMP")); - assertThat(resultSet.getLong("MUTATION_COUNT")).isEqualTo(2L); + assertEquals(2L, resultSet.getLong("MUTATION_COUNT")); assertNotNull(resultSet.getString("OVERLOAD_DELAY")); assertFalse(resultSet.next()); } From bf0a7bddeb0f7cfadb6139570192a35ecd1570c9 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Fri, 5 Feb 2021 16:55:45 +0100 Subject: [PATCH 27/33] fix: fix wrong error code --- .../cloud/spanner/connection/SingleUseTransactionTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java index 0954a01e4df..4836161a3ee 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java @@ -765,7 +765,7 @@ public void testGetCommitResponseAfterQuery() { transaction.getCommitResponse(); fail("missing expected exception"); } catch (SpannerException e) { - assertEquals(ErrorCode.INVALID_ARGUMENT, e.getErrorCode()); + assertEquals(ErrorCode.FAILED_PRECONDITION, e.getErrorCode()); } assertNull(transaction.getCommitResponseOrNull()); } @@ -779,7 +779,7 @@ public void testGetCommitResponseAfterDdl() { transaction.getCommitResponse(); fail("missing expected exception"); } catch (SpannerException e) { - assertEquals(ErrorCode.INVALID_ARGUMENT, e.getErrorCode()); + assertEquals(ErrorCode.FAILED_PRECONDITION, e.getErrorCode()); } assertNull(transaction.getCommitResponseOrNull()); } From 48ef21be5bcf41f8cacfa1eaceaab5726624240c Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Mon, 8 Feb 2021 18:51:11 +0100 Subject: [PATCH 28/33] chore: cleanup test and variable names --- .../google/cloud/spanner/CommitResponse.java | 2 +- .../com/google/cloud/spanner/SessionImpl.java | 3 - .../com/google/cloud/spanner/SessionPool.java | 6 +- .../cloud/spanner/AsyncRunnerImplTest.java | 23 +++--- .../google/cloud/spanner/AsyncRunnerTest.java | 24 ++++++ .../AsyncTransactionManagerImplTest.java | 2 +- .../spanner/AsyncTransactionManagerTest.java | 9 ++- .../cloud/spanner/CommitResponseTest.java | 7 ++ .../cloud/spanner/DatabaseClientImplTest.java | 76 ++++++++++--------- .../spanner/InlineBeginTransactionTest.java | 2 +- .../cloud/spanner/MockSpannerServiceImpl.java | 6 +- .../com/google/cloud/spanner/OptionsTest.java | 40 +++++----- .../RetryOnInvalidatedSessionTest.java | 13 +++- .../google/cloud/spanner/SessionPoolTest.java | 2 +- .../spanner/TransactionContextImplTest.java | 10 +-- .../spanner/TransactionManagerImplTest.java | 3 +- .../connection/ConnectionImplTest.java | 14 ++-- .../connection/ReadWriteTransactionTest.java | 3 +- .../connection/SingleUseTransactionTest.java | 9 +-- .../cloud/spanner/it/ITAsyncAPITest.java | 22 +++--- .../cloud/spanner/it/ITTransactionTest.java | 2 +- .../google/cloud/spanner/it/ITWriteTest.java | 4 +- 22 files changed, 160 insertions(+), 122 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java index 233a700eb54..00505cf8d1f 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitResponse.java @@ -33,7 +33,7 @@ public CommitResponse(Timestamp commitTimestamp) { } CommitResponse(com.google.spanner.v1.CommitResponse proto) { - this.proto = proto; + this.proto = Preconditions.checkNotNull(proto); } /** Returns a {@link Timestamp} representing the commit time of the transaction. */ diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java index e7a4da8c7c0..51ec7b4d50d 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java @@ -177,9 +177,6 @@ public CommitResponse writeAtLeastOnceWithOptions( com.google.spanner.v1.CommitResponse response = spanner.getRpc().commit(request, this.options); return new CommitResponse(response); - } catch (IllegalArgumentException e) { - TraceUtil.setWithFailure(span, e); - throw newSpannerException(ErrorCode.INTERNAL, "Could not parse commit response", e); } catch (RuntimeException e) { TraceUtil.setWithFailure(span, e); throw e; 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 9cbe4d65a6f..51a42525bfc 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 @@ -37,6 +37,7 @@ import static com.google.cloud.spanner.MetricRegistryConstants.SPANNER_LABEL_KEYS; import static com.google.cloud.spanner.MetricRegistryConstants.SPANNER_LABEL_KEYS_WITH_TYPE; import static com.google.cloud.spanner.SpannerExceptionFactory.newSpannerException; +import static com.google.common.base.Preconditions.checkState; import com.google.api.core.ApiFunction; import com.google.api.core.ApiFuture; @@ -970,7 +971,7 @@ private static class SessionPoolAsyncRunner implements AsyncRunner { private final SessionPool sessionPool; private volatile PooledSessionFuture session; private final TransactionOption[] options; - private final SettableApiFuture commitResponse = SettableApiFuture.create(); + private SettableApiFuture commitResponse; private SessionPoolAsyncRunner( SessionPool sessionPool, PooledSessionFuture session, TransactionOption... options) { @@ -981,6 +982,7 @@ private SessionPoolAsyncRunner( @Override public ApiFuture runAsync(final AsyncWork work, Executor executor) { + commitResponse = SettableApiFuture.create(); final SettableApiFuture res = SettableApiFuture.create(); executor.execute( new Runnable() { @@ -1041,6 +1043,7 @@ private void setCommitResponse(AsyncRunner delegate) { @Override public ApiFuture getCommitTimestamp() { + checkState(commitResponse != null, "runAsync() has not yet been called"); return ApiFutures.transform( commitResponse, new ApiFunction() { @@ -1054,6 +1057,7 @@ public Timestamp apply(CommitResponse input) { @Override public ApiFuture getCommitResponse() { + checkState(commitResponse != null, "runAsync() has not yet been called"); return commitResponse; } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncRunnerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncRunnerImplTest.java index 3f74a71832d..fab29d29005 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncRunnerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncRunnerImplTest.java @@ -16,7 +16,10 @@ package com.google.cloud.spanner; -import static com.google.common.truth.Truth.assertThat; +import static com.google.cloud.spanner.SpannerApiFutures.get; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; @@ -63,9 +66,10 @@ public ApiFuture doWorkAsync(TransactionContext txn) { }, executor); - assertThat(SpannerApiFutures.get(result)).isSameInstanceAs(expectedResult); - assertThat(SpannerApiFutures.get(runner.getCommitResponse())) - .isSameInstanceAs(expectedCommitResponse); + assertSame(expectedResult, get(result)); + assertSame(expectedCommitResponse, get(runner.getCommitResponse())); + assertEquals( + get(runner.getCommitResponse()).getCommitTimestamp(), get(runner.getCommitTimestamp())); } @Test @@ -76,7 +80,7 @@ public void testGetCommitTimestampReturnsErrorBeforeRun() { runner.getCommitTimestamp(); fail("missing expected exception"); } catch (IllegalStateException e) { - assertThat(e.getMessage()).contains("runAsync() has not yet been called"); + assertTrue(e.getMessage().contains("runAsync() has not yet been called")); } } @@ -88,7 +92,7 @@ public void testGetCommitResponseReturnsErrorBeforeRun() { runner.getCommitResponse(); fail("missing expected exception"); } catch (IllegalStateException e) { - assertThat(e.getMessage()).contains("runAsync() has not yet been called"); + assertTrue(e.getMessage().contains("runAsync() has not yet been called")); } } @@ -111,13 +115,14 @@ public ApiFuture doWorkAsync(TransactionContext txn) { executor); try { - SpannerApiFutures.get(runner.getCommitResponse()); + get(runner.getCommitResponse()); fail("missing expected exception"); } catch (SpannerException e) { - assertThat(e).isSameInstanceAs(expectedException); + assertSame(expectedException, e); } } + @SuppressWarnings("unchecked") @Test public void testRunAyncFailsIfCalledMultipleTimes() { final Object result = new Object(); @@ -145,7 +150,7 @@ public ApiFuture doWorkAsync(TransactionContext txn) { executor); fail("missing expected exception"); } catch (IllegalStateException e) { - assertThat(e.getMessage()).contains("runAsync() can only be called once"); + assertTrue(e.getMessage().contains("runAsync() can only be called once")); } } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncRunnerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncRunnerTest.java index 2af185ae144..0c67871e899 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncRunnerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncRunnerTest.java @@ -18,6 +18,7 @@ import static com.google.cloud.spanner.MockSpannerTestUtil.*; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import com.google.api.core.ApiFunction; @@ -53,6 +54,29 @@ @RunWith(JUnit4.class) public class AsyncRunnerTest extends AbstractAsyncTransactionTest { + + @Test + public void testAsyncRunner_doesNotReturnCommitTimestampBeforeCommit() { + AsyncRunner runner = client().runAsync(); + try { + runner.getCommitTimestamp(); + fail("missing expected exception"); + } catch (IllegalStateException e) { + assertTrue(e.getMessage().contains("runAsync() has not yet been called")); + } + } + + @Test + public void testAsyncRunner_doesNotReturnCommitResponseBeforeCommit() { + AsyncRunner runner = client().runAsync(); + try { + runner.getCommitResponse(); + fail("missing expected exception"); + } catch (IllegalStateException e) { + assertTrue(e.getMessage().contains("runAsync() has not yet been called")); + } + } + @Test public void asyncRunnerUpdate() throws Exception { AsyncRunner runner = client().runAsync(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java index 895b4fb9127..14620389d49 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java @@ -42,7 +42,7 @@ public void setUp() { } @Test - public void commitReturnsCommitStats() { + public void testCommitReturnsCommitStats() { try (AsyncTransactionManagerImpl manager = new AsyncTransactionManagerImpl(session, mock(Span.class), Options.commitStats())) { when(session.newTransaction(Options.fromTransactionOptions(Options.commitStats()))) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java index 1740aa02437..748d6f76405 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java @@ -216,14 +216,15 @@ public boolean apply(AbstractMessage input) { } @Test - public void asyncTransactionManager_returnsCommitStats() throws Exception { + public void testAsyncTransactionManager_returnsCommitStats() throws Exception { try (AsyncTransactionManager manager = client().transactionManagerAsync(Options.commitStats())) { - TransactionContextFuture txn = manager.beginAsync(); + TransactionContextFuture transaction = manager.beginAsync(); while (true) { try { CommitTimestampFuture commitTimestamp = - txn.then( + transaction + .then( AsyncTransactionManagerHelper.buffer( Mutation.delete("FOO", Key.of("foo"))), executor) @@ -234,7 +235,7 @@ public void asyncTransactionManager_returnsCommitStats() throws Exception { assertEquals(1L, manager.getCommitResponse().get().getCommitStats().getMutationCount()); break; } catch (AbortedException e) { - txn = manager.resetForRetryAsync(); + transaction = manager.resetForRetryAsync(); } } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java index 16c498392db..0814bdc0717 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java @@ -28,6 +28,13 @@ @RunWith(JUnit4.class) public class CommitResponseTest { + @Test + public void testConstructWithTimestamp() { + Timestamp timestamp = Timestamp.ofTimeSecondsAndNanos(100L, 100); + CommitResponse response = new CommitResponse(timestamp); + assertEquals(timestamp, response.getCommitTimestamp()); + } + @Test public void testFromProto() { long mutationCount = 5L; diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java index dfe8867b96a..42a158d755b 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java @@ -32,6 +32,7 @@ import com.google.api.gax.grpc.testing.LocalChannelProvider; import com.google.api.gax.retrying.RetrySettings; import com.google.cloud.NoCredentials; +import com.google.cloud.Timestamp; import com.google.cloud.spanner.AbstractResultSet.GrpcStreamIterator; import com.google.cloud.spanner.AsyncResultSet.CallbackResponse; import com.google.cloud.spanner.AsyncResultSet.ReadyCallback; @@ -159,16 +160,18 @@ public void tearDown() { } @Test - public void write() { + public void testWrite() { DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); - client.write( - Arrays.asList( - Mutation.newInsertBuilder("FOO").set("ID").to(1L).set("NAME").to("Bar").build())); + Timestamp timestamp = + client.write( + Arrays.asList( + Mutation.newInsertBuilder("FOO").set("ID").to(1L).set("NAME").to("Bar").build())); + assertNotNull(timestamp); } @Test - public void writeWithCommitStats() { + public void testWriteWithCommitStats() { DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); CommitResponse response = @@ -182,16 +185,18 @@ public void writeWithCommitStats() { } @Test - public void writeAtLeastOnce() { + public void testWriteAtLeastOnce() { DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); - client.writeAtLeastOnce( - Arrays.asList( - Mutation.newInsertBuilder("FOO").set("ID").to(1L).set("NAME").to("Bar").build())); + Timestamp timestamp = + client.writeAtLeastOnce( + Arrays.asList( + Mutation.newInsertBuilder("FOO").set("ID").to(1L).set("NAME").to("Bar").build())); + assertNotNull(timestamp); } @Test - public void writeAtLeastOnceWithCommitStats() { + public void testWriteAtLeastOnceWithCommitStats() { DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); CommitResponse response = @@ -458,7 +463,7 @@ public void readOnlyTransactionBoundIsNonBlocking() { } @Test - public void readWriteTransaction() { + public void testReadWriteTransaction() { DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); TransactionRunner runner = client.readWriteTransaction(); @@ -470,10 +475,11 @@ public Void run(TransactionContext transaction) throws Exception { return null; } }); + assertNotNull(runner.getCommitTimestamp()); } @Test - public void readWriteTransaction_returnsCommitStats() { + public void testReadWriteTransaction_returnsCommitStats() { DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); TransactionRunner runner = client.readWriteTransaction(Options.commitStats()); @@ -511,12 +517,12 @@ public Void run(TransactionContext transaction) throws Exception { } @Test - public void runAsync() throws Exception { + public void testRunAsync() throws Exception { DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); ExecutorService executor = Executors.newSingleThreadExecutor(); AsyncRunner runner = client.runAsync(); - ApiFuture fut = + ApiFuture result = runner.runAsync( new AsyncWork() { @Override @@ -525,17 +531,18 @@ public ApiFuture doWorkAsync(TransactionContext txn) { } }, executor); - assertThat(fut.get()).isEqualTo(UPDATE_COUNT); + assertEquals(UPDATE_COUNT, result.get().longValue()); + assertNotNull(runner.getCommitTimestamp().get()); executor.shutdown(); } @Test - public void runAsync_returnsCommitStats() { + public void testRunAsync_returnsCommitStats() { DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); ExecutorService executor = Executors.newSingleThreadExecutor(); AsyncRunner runner = client.runAsync(Options.commitStats()); - ApiFuture fut = + ApiFuture result = runner.runAsync( new AsyncWork() { @Override @@ -545,7 +552,7 @@ public ApiFuture doWorkAsync(TransactionContext txn) { } }, executor); - assertNull(get(fut)); + assertNull(get(result)); assertNotNull(get(runner.getCommitResponse())); assertNotNull(get(runner.getCommitResponse()).getCommitStats()); assertEquals(1L, get(runner.getCommitResponse()).getCommitStats().getMutationCount()); @@ -601,41 +608,40 @@ public ApiFuture doWorkAsync(TransactionContext txn) { } @Test - public void transactionManager() throws Exception { + public void testTransactionManager() throws Exception { DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); - try (TransactionManager txManager = client.transactionManager()) { + try (TransactionManager manager = client.transactionManager()) { while (true) { - TransactionContext tx = txManager.begin(); + TransactionContext transaction = manager.begin(); try { - tx.executeUpdate(UPDATE_STATEMENT); - txManager.commit(); + transaction.executeUpdate(UPDATE_STATEMENT); + manager.commit(); + assertNotNull(manager.getCommitTimestamp()); break; } catch (AbortedException e) { - Thread.sleep(e.getRetryDelayInMillis() / 1000); - tx = txManager.resetForRetry(); + transaction = manager.resetForRetry(); } } } } @Test - public void transactionManager_returnsCommitStats() throws InterruptedException { + public void testTransactionManager_returnsCommitStats() throws InterruptedException { DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE)); - try (TransactionManager txManager = client.transactionManager(Options.commitStats())) { + try (TransactionManager manager = client.transactionManager(Options.commitStats())) { while (true) { - TransactionContext tx = txManager.begin(); + TransactionContext transaction = manager.begin(); try { - tx.buffer(Mutation.delete("FOO", Key.of("foo"))); - txManager.commit(); - assertNotNull(txManager.getCommitResponse()); - assertNotNull(txManager.getCommitResponse().getCommitStats()); - assertEquals(1L, txManager.getCommitResponse().getCommitStats().getMutationCount()); + transaction.buffer(Mutation.delete("FOO", Key.of("foo"))); + manager.commit(); + assertNotNull(manager.getCommitResponse()); + assertNotNull(manager.getCommitResponse().getCommitStats()); + assertEquals(1L, manager.getCommitResponse().getCommitStats().getMutationCount()); break; } catch (AbortedException e) { - Thread.sleep(e.getRetryDelayInMillis() / 1000); - tx = txManager.resetForRetry(); + transaction = manager.resetForRetry(); } } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java index 2a547545888..8df71a538c0 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java @@ -1489,7 +1489,7 @@ public Void run(TransactionContext transaction) throws Exception { } catch (Throwable t) { mockSpanner.unfreeze(); // Wait until the update actually finishes so it has returned a transaction. - // That should ensure that the retry does not issue a BeginTransaction RPC. + // That ensures that the retry does not issue a BeginTransaction RPC. SpannerApiFutures.get(updateCount); throw t; } 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 598a1952f00..5c631c3c6a2 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 @@ -187,7 +187,6 @@ * } */ public class MockSpannerServiceImpl extends SpannerImplBase implements MockGrpcService { - private static final Random RANDOM = new Random(); private static class PartialResultSetsIterator implements Iterator { private static final int MAX_ROWS_IN_CHUNK = 1; @@ -410,6 +409,7 @@ private StatusRuntimeException getException() { /** Class for simulating execution time of server calls. */ public static class SimulatedExecutionTime { + private static final Random RANDOM = new Random(); private final int minimumExecutionTime; private final int randomExecutionTime; private final Queue exceptions; @@ -503,9 +503,7 @@ void simulateExecutionTime( } if (minimumExecutionTime > 0 || randomExecutionTime > 0) { Uninterruptibles.sleepUninterruptibly( - (randomExecutionTime == 0 - ? 0 - : MockSpannerServiceImpl.RANDOM.nextInt(randomExecutionTime)) + (randomExecutionTime == 0 ? 0 : RANDOM.nextInt(randomExecutionTime)) + minimumExecutionTime, TimeUnit.MILLISECONDS); } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java index 28d53de3299..d483072760c 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java @@ -232,50 +232,50 @@ public void testFromTransactionOptions_toStringNoOptions() { @Test public void testFromTransactionOptions_toStringWithCommitStats() { - Options opts = Options.fromTransactionOptions(Options.commitStats()); - assertThat(opts.toString()).contains("withCommitStats: true"); + Options options = Options.fromTransactionOptions(Options.commitStats()); + assertThat(options.toString()).contains("withCommitStats: true"); } @Test public void testTransactionOptions_noOptionsAreEqual() { - Options o1 = Options.fromTransactionOptions(); - Options o2 = Options.fromTransactionOptions(); - assertTrue(o1.equals(o2)); + Options option1 = Options.fromTransactionOptions(); + Options option2 = Options.fromTransactionOptions(); + assertTrue(option1.equals(option2)); } @Test public void testTransactionOptions_withCommitStatsAreEqual() { - Options o1 = Options.fromTransactionOptions(Options.commitStats()); - Options o2 = Options.fromTransactionOptions(Options.commitStats()); - assertTrue(o1.equals(o2)); + Options option1 = Options.fromTransactionOptions(Options.commitStats()); + Options option2 = Options.fromTransactionOptions(Options.commitStats()); + assertTrue(option1.equals(option2)); } @Test public void testTransactionOptions_withCommitStatsAndOtherOptionAreNotEqual() { - Options o1 = Options.fromTransactionOptions(Options.commitStats()); - Options o2 = Options.fromQueryOptions(Options.prefetchChunks(10)); - assertFalse(o1.equals(o2)); + Options option1 = Options.fromTransactionOptions(Options.commitStats()); + Options option2 = Options.fromQueryOptions(Options.prefetchChunks(10)); + assertFalse(option1.equals(option2)); } @Test public void testTransactionOptions_noOptionsHashCode() { - Options o1 = Options.fromTransactionOptions(); - Options o2 = Options.fromTransactionOptions(); - assertEquals(o2.hashCode(), o1.hashCode()); + Options option1 = Options.fromTransactionOptions(); + Options option2 = Options.fromTransactionOptions(); + assertEquals(option2.hashCode(), option1.hashCode()); } @Test public void testTransactionOptions_withCommitStatsHashCode() { - Options o1 = Options.fromTransactionOptions(Options.commitStats()); - Options o2 = Options.fromTransactionOptions(Options.commitStats()); - assertEquals(o2.hashCode(), o1.hashCode()); + Options option1 = Options.fromTransactionOptions(Options.commitStats()); + Options option2 = Options.fromTransactionOptions(Options.commitStats()); + assertEquals(option2.hashCode(), option1.hashCode()); } @Test public void testTransactionOptions_withCommitStatsAndOtherOptionHashCode() { - Options o1 = Options.fromTransactionOptions(Options.commitStats()); - Options o2 = Options.fromQueryOptions(Options.prefetchChunks(10)); - assertNotEquals(o2.hashCode(), o1.hashCode()); + Options option1 = Options.fromTransactionOptions(Options.commitStats()); + Options option2 = Options.fromQueryOptions(Options.prefetchChunks(10)); + assertNotEquals(option2.hashCode(), option1.hashCode()); } @Test diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/RetryOnInvalidatedSessionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/RetryOnInvalidatedSessionTest.java index e49c7e739cc..157d71bf367 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/RetryOnInvalidatedSessionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/RetryOnInvalidatedSessionTest.java @@ -18,6 +18,10 @@ import static com.google.cloud.spanner.SpannerApiFutures.get; import static com.google.common.truth.Truth.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 com.google.api.core.ApiFunction; @@ -1151,7 +1155,7 @@ public void transactionManagerReadRowUsingIndex() throws InterruptedException { @Test public void transactionManagerUpdate() throws InterruptedException { invalidateSessionPool(); - try (TransactionManager manager = client.transactionManager()) { + try (TransactionManager manager = client.transactionManager(Options.commitStats())) { long count; TransactionContext transaction = manager.begin(); while (true) { @@ -1164,10 +1168,11 @@ public void transactionManagerUpdate() throws InterruptedException { transaction = manager.resetForRetry(); } } - assertThat(count).isEqualTo(UPDATE_COUNT); - assertThat(failOnInvalidatedSession).isFalse(); + assertEquals(UPDATE_COUNT, count); + assertNotNull(manager.getCommitResponse().getCommitStats()); + assertFalse(failOnInvalidatedSession); } catch (SessionNotFoundException e) { - assertThat(failOnInvalidatedSession).isTrue(); + assertTrue(failOnInvalidatedSession); } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java index db6e22b9232..337510757d8 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolTest.java @@ -892,8 +892,8 @@ public void testSessionNotFoundReadWriteTransaction() { final TransactionContextImpl closedTransactionContext = TransactionContextImpl.newBuilder() .setSession(closedSession) - .setRpc(rpc) .setOptions(Options.fromTransactionOptions()) + .setRpc(rpc) .build(); when(closedSession.asyncClose()) .thenReturn(ApiFutures.immediateFuture(Empty.getDefaultInstance())); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionContextImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionContextImplTest.java index 82c826ae737..1ca9e0e6673 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionContextImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionContextImplTest.java @@ -55,25 +55,25 @@ public void batchDmlException() { public void testReturnCommitStats() { SessionImpl session = mock(SessionImpl.class); when(session.getName()).thenReturn("test"); - ByteString txId = ByteString.copyFromUtf8("test"); + ByteString transactionId = ByteString.copyFromUtf8("test"); SpannerRpc rpc = mock(SpannerRpc.class); when(rpc.commitAsync(any(CommitRequest.class), anyMap())) .thenReturn( ApiFutures.immediateFuture(com.google.spanner.v1.CommitResponse.getDefaultInstance())); - try (TransactionContextImpl impl = + try (TransactionContextImpl context = TransactionContextImpl.newBuilder() .setSession(session) .setRpc(rpc) - .setTransactionId(txId) + .setTransactionId(transactionId) .setOptions(Options.fromTransactionOptions(Options.commitStats())) .build()) { - impl.commitAsync(); + context.commitAsync(); CommitRequest request = CommitRequest.newBuilder() .setReturnCommitStats(true) .setSession(session.getName()) - .setTransactionId(txId) + .setTransactionId(transactionId) .build(); verify(rpc).commitAsync(Mockito.eq(request), anyMap()); } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java index 5c2607f6252..4ffed254cb6 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java @@ -140,8 +140,7 @@ public void transactionRolledBackOnClose() { public void commitSucceeds() { when(session.newTransaction(Options.fromTransactionOptions())).thenReturn(txn); Timestamp commitTimestamp = Timestamp.ofTimeMicroseconds(1); - CommitResponse response = mock(CommitResponse.class); - when(response.getCommitTimestamp()).thenReturn(commitTimestamp); + CommitResponse response = new CommitResponse(commitTimestamp); when(txn.getCommitResponse()).thenReturn(response); manager.begin(); manager.commit(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java index 79b09011f44..113738bf058 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java @@ -100,9 +100,7 @@ public TransactionContext begin() { @Override public void commit() { - Timestamp commitTimestamp = Timestamp.now(); - commitResponse = mock(CommitResponse.class); - when(commitResponse.getCommitTimestamp()).thenReturn(commitTimestamp); + commitResponse = new CommitResponse(Timestamp.ofTimeSecondsAndNanos(1, 1)); state = TransactionState.COMMITTED; } @@ -329,13 +327,11 @@ public TransactionRunner answer(InvocationOnMock invocation) { @Override public T run(TransactionCallable callable) { - Timestamp commitTimestamp = Timestamp.now(); - commitResponse = mock(CommitResponse.class); - when(commitResponse.getCommitTimestamp()).thenReturn(commitTimestamp); - TransactionContext tx = mock(TransactionContext.class); - when(tx.executeUpdate(Statement.of(UPDATE))).thenReturn(1L); + commitResponse = new CommitResponse(Timestamp.ofTimeSecondsAndNanos(1, 1)); + TransactionContext transaction = mock(TransactionContext.class); + when(transaction.executeUpdate(Statement.of(UPDATE))).thenReturn(1L); try { - return callable.run(tx); + return callable.run(transaction); } catch (Exception e) { throw SpannerExceptionFactory.newSpannerException(e); } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadWriteTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadWriteTransactionTest.java index e6138e0f16b..de5c9fbdeba 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadWriteTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ReadWriteTransactionTest.java @@ -89,8 +89,7 @@ public TransactionContext begin() { public void commit() { switch (commitBehavior) { case SUCCEED: - commitResponse = mock(CommitResponse.class); - when(commitResponse.getCommitTimestamp()).thenReturn(Timestamp.now()); + commitResponse = new CommitResponse(Timestamp.ofTimeSecondsAndNanos(1, 1)); state = TransactionState.COMMITTED; break; case FAIL: diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java index 12ebf81e17c..af761d4cbef 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SingleUseTransactionTest.java @@ -117,9 +117,7 @@ public TransactionContext begin() { public void commit() { switch (commitBehavior) { case SUCCEED: - Timestamp commitTimestamp = Timestamp.now(); - commitResponse = mock(CommitResponse.class); - when(commitResponse.getCommitTimestamp()).thenReturn(commitTimestamp); + commitResponse = new CommitResponse(Timestamp.ofTimeSecondsAndNanos(1, 1)); state = TransactionState.COMMITTED; break; case FAIL: @@ -406,9 +404,8 @@ public T run(TransactionCallable callable) { } catch (Exception e) { throw SpannerExceptionFactory.newSpannerException(e); } - Timestamp commitTimestamp = Timestamp.now(); - commitResponse = mock(CommitResponse.class); - when(commitResponse.getCommitTimestamp()).thenReturn(commitTimestamp); + commitResponse = + new CommitResponse(Timestamp.ofTimeSecondsAndNanos(1, 1)); return res; } else if (commitBehavior == CommitBehavior.FAIL) { throw SpannerExceptionFactory.newSpannerException( diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java index 0c6aa579822..7a320802f23 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java @@ -320,14 +320,14 @@ public ApiFuture doWorkAsync(TransactionContext txn) { } @Test - public void asyncRunnerReturnsCommitStats() { + public void testAsyncRunnerReturnsCommitStats() { assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); AsyncRunner runner = client.runAsync(Options.commitStats()); runner.runAsync( new AsyncWork() { @Override - public ApiFuture doWorkAsync(TransactionContext txn) { - txn.buffer( + public ApiFuture doWorkAsync(TransactionContext transaction) { + transaction.buffer( Mutation.newInsertOrUpdateBuilder(TABLE_NAME) .set("Key") .to("k_commit_stats") @@ -344,10 +344,10 @@ public ApiFuture doWorkAsync(TransactionContext txn) { } @Test - public void asyncTransactionManagerReturnsCommitStats() throws InterruptedException { + public void testAsyncTransactionManagerReturnsCommitStats() throws InterruptedException { assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); - try (AsyncTransactionManager mgr = client.transactionManagerAsync(Options.commitStats())) { - TransactionContextFuture context = mgr.beginAsync(); + try (AsyncTransactionManager manager = client.transactionManagerAsync(Options.commitStats())) { + TransactionContextFuture context = manager.beginAsync(); while (true) { try { get( @@ -355,9 +355,9 @@ public void asyncTransactionManagerReturnsCommitStats() throws InterruptedExcept .then( new AsyncTransactionFunction() { @Override - public ApiFuture apply(TransactionContext txn, Void input) + public ApiFuture apply(TransactionContext transaction, Void input) throws Exception { - txn.buffer( + transaction.buffer( Mutation.newInsertOrUpdateBuilder(TABLE_NAME) .set("Key") .to("k_commit_stats") @@ -369,12 +369,12 @@ public ApiFuture apply(TransactionContext txn, Void input) }, executor) .commitAsync()); - assertNotNull(get(mgr.getCommitResponse()).getCommitStats()); - assertEquals(4L, get(mgr.getCommitResponse()).getCommitStats().getMutationCount()); + assertNotNull(get(manager.getCommitResponse()).getCommitStats()); + assertEquals(4L, get(manager.getCommitResponse()).getCommitStats().getMutationCount()); break; } catch (AbortedException e) { Thread.sleep(e.getRetryDelayInMillis() / 1000); - context = mgr.resetForRetryAsync(); + context = manager.resetForRetryAsync(); } } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java index ade9129d03a..ed2bc564b06 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java @@ -635,7 +635,7 @@ public Long run(TransactionContext transaction) throws Exception { } @Test - public void transactionRunnerReturnsCommitStats() { + public void testTransactionRunnerReturnsCommitStats() { assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); final String key = uniqueKey(); TransactionRunner runner = client.readWriteTransaction(Options.commitStats()); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java index 5d288d4ed64..3cf9d387a15 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITWriteTest.java @@ -162,7 +162,7 @@ public void writeAtLeastOnce() { } @Test - public void writeReturnsCommitStats() { + public void testWriteReturnsCommitStats() { assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); CommitResponse response = client.writeWithOptions( @@ -181,7 +181,7 @@ public void writeReturnsCommitStats() { } @Test - public void writeAtLeastOnceReturnsCommitStats() { + public void testWriteAtLeastOnceReturnsCommitStats() { assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); CommitResponse response = client.writeAtLeastOnceWithOptions( From 1f33c42743920b21a8b70cf008f55f8983d49620 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Tue, 9 Feb 2021 11:45:43 +0100 Subject: [PATCH 29/33] fix: rename test method and variables --- .../google/cloud/spanner/it/ITTransactionManagerTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java index fb5d374e854..2346277ce79 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java @@ -217,12 +217,12 @@ public void abortAndRetry() throws InterruptedException { @SuppressWarnings("resource") @Test - public void transactionManagerReturnsCommitStats() throws InterruptedException { + public void testTransactionManagerReturnsCommitStats() throws InterruptedException { assumeFalse("Emulator does not return commit statistics", isUsingEmulator()); try (TransactionManager manager = client.transactionManager(Options.commitStats())) { - TransactionContext txn = manager.begin(); + TransactionContext transaction = manager.begin(); while (true) { - txn.buffer( + transaction.buffer( Mutation.newInsertBuilder("T") .set("K") .to("KeyCommitStats") @@ -236,7 +236,7 @@ public void transactionManagerReturnsCommitStats() throws InterruptedException { break; } catch (AbortedException e) { Thread.sleep(e.getRetryDelayInMillis() / 1000); - txn = manager.resetForRetry(); + transaction = manager.resetForRetry(); } } } From 7d45ace4c1af0c4691b1fdfc2a1a74b88e4f53f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Tue, 16 Feb 2021 15:14:24 +0100 Subject: [PATCH 30/33] fix: address review comments --- .../com/google/cloud/spanner/AsyncRunner.java | 2 +- .../spanner/AsyncTransactionManagerImpl.java | 6 +++--- .../com/google/cloud/spanner/CommitStats.java | 10 ++++----- .../AsyncTransactionManagerImplTest.java | 21 +++++++------------ .../cloud/spanner/CommitResponseTest.java | 5 ++--- .../spanner/InlineBeginTransactionTest.java | 2 +- .../cloud/spanner/MockSpannerServiceImpl.java | 1 - .../com/google/cloud/spanner/OptionsTest.java | 8 +++---- .../cloud/spanner/it/ITAsyncAPITest.java | 2 +- .../spanner/it/ITTransactionManagerTest.java | 2 +- 10 files changed, 24 insertions(+), 35 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunner.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunner.java index 8f88f38aa6e..c9dec98d55d 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunner.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncRunner.java @@ -58,7 +58,7 @@ interface AsyncWork { ApiFuture getCommitTimestamp(); /** - * Returns the {@link CommitResponse} of this transaction. {@link ApiFuture#get()} will throw an + * Returns the {@link CommitResponse} of this transaction. {@link ApiFuture#get()} throws an * {@link ExecutionException} if the transaction did not commit. */ ApiFuture getCommitResponse(); diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManagerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManagerImpl.java index 823efc18db8..2ec914c24aa 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManagerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManagerImpl.java @@ -133,11 +133,11 @@ public ApiFuture commitAsync() { SpannerExceptionFactory.newSpannerException( ErrorCode.ABORTED, "Transaction already aborted")); } - ApiFuture res = txn.commitAsync(); + ApiFuture commitResponseFuture = txn.commitAsync(); txnState = TransactionState.COMMITTED; ApiFutures.addCallback( - res, + commitResponseFuture, new ApiFutureCallback() { @Override public void onFailure(Throwable t) { @@ -156,7 +156,7 @@ public void onSuccess(CommitResponse result) { }, MoreExecutors.directExecutor()); return ApiFutures.transform( - res, + commitResponseFuture, new ApiFunction() { @Override public Timestamp apply(CommitResponse input) { diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java index 95b2d7e43a6..eaf1a78819f 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/CommitStats.java @@ -42,11 +42,11 @@ static CommitStats fromProto(com.google.spanner.v1.CommitResponse.CommitStats pr * row from a parent table that has the ON DELETE CASCADE annotation is also counted as one * mutation regardless of the number of interleaved child rows present. The exception to this is * if there are secondary indexes defined on rows being deleted, then the changes to the secondary - * indexes will be counted individually. For example, if a table has 2 secondary indexes, deleting - * a range of rows in the table will count as 1 mutation for the table, plus 2 mutations for each - * row that is deleted because the rows in the secondary index might be scattered over the - * key-space, making it impossible for Cloud Spanner to call a single delete range operation on - * the secondary indexes. Secondary indexes include the foreign keys backing indexes. + * indexes are counted individually. For example, if a table has 2 secondary indexes, deleting a + * range of rows in the table counts as 1 mutation for the table, plus 2 mutations for each row + * that is deleted because the rows in the secondary index might be scattered over the key-space, + * making it impossible for Cloud Spanner to call a single delete range operation on the secondary + * indexes. Secondary indexes include the foreign keys backing indexes. */ public long getMutationCount() { return mutationCount; diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java index 14620389d49..c60363e7932 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerImplTest.java @@ -19,42 +19,35 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.mockito.MockitoAnnotations.initMocks; import com.google.api.core.ApiFutures; import com.google.cloud.Timestamp; import io.opencensus.trace.Span; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; -@RunWith(JUnit4.class) +@RunWith(MockitoJUnitRunner.class) public class AsyncTransactionManagerImplTest { @Mock private SessionImpl session; - @Mock TransactionRunnerImpl.TransactionContextImpl txn; - - @Before - public void setUp() { - initMocks(this); - } + @Mock TransactionRunnerImpl.TransactionContextImpl transaction; @Test public void testCommitReturnsCommitStats() { try (AsyncTransactionManagerImpl manager = new AsyncTransactionManagerImpl(session, mock(Span.class), Options.commitStats())) { when(session.newTransaction(Options.fromTransactionOptions(Options.commitStats()))) - .thenReturn(txn); - when(txn.ensureTxnAsync()).thenReturn(ApiFutures.immediateFuture(null)); + .thenReturn(transaction); + when(transaction.ensureTxnAsync()).thenReturn(ApiFutures.immediateFuture(null)); Timestamp commitTimestamp = Timestamp.ofTimeMicroseconds(1); CommitResponse response = mock(CommitResponse.class); when(response.getCommitTimestamp()).thenReturn(commitTimestamp); - when(txn.commitAsync()).thenReturn(ApiFutures.immediateFuture(response)); + when(transaction.commitAsync()).thenReturn(ApiFutures.immediateFuture(response)); manager.beginAsync(); manager.commitAsync(); - verify(txn).commitAsync(); + verify(transaction).commitAsync(); } } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java index 0814bdc0717..7fb4c559d4d 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/CommitResponseTest.java @@ -17,7 +17,6 @@ package com.google.cloud.spanner; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import com.google.cloud.Timestamp; @@ -77,8 +76,8 @@ public void testEqualsAndHashCode() { assertEquals(response3, response1); assertNotEquals(response2, response1); assertNotEquals(response3, response2); - assertFalse(response1.equals(null)); - assertFalse(response1.equals(new Object())); + assertNotEquals(response1, null); + assertNotEquals(response1, new Object()); assertEquals(response3.hashCode(), response1.hashCode()); assertNotEquals(response2.hashCode(), response1.hashCode()); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java index 8df71a538c0..5aa2948b518 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/InlineBeginTransactionTest.java @@ -1489,7 +1489,7 @@ public Void run(TransactionContext transaction) throws Exception { } catch (Throwable t) { mockSpanner.unfreeze(); // Wait until the update actually finishes so it has returned a transaction. - // That ensures that the retry does not issue a BeginTransaction RPC. + // This ensures that the retry does not issue a BeginTransaction RPC. SpannerApiFutures.get(updateCount); throw t; } 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 5c631c3c6a2..424e9796923 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 @@ -187,7 +187,6 @@ * } */ public class MockSpannerServiceImpl extends SpannerImplBase implements MockGrpcService { - private static class PartialResultSetsIterator implements Iterator { private static final int MAX_ROWS_IN_CHUNK = 1; diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java index d483072760c..db642aedd12 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OptionsTest.java @@ -18,10 +18,8 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.junit.Test; @@ -240,21 +238,21 @@ public void testFromTransactionOptions_toStringWithCommitStats() { public void testTransactionOptions_noOptionsAreEqual() { Options option1 = Options.fromTransactionOptions(); Options option2 = Options.fromTransactionOptions(); - assertTrue(option1.equals(option2)); + assertEquals(option1, option2); } @Test public void testTransactionOptions_withCommitStatsAreEqual() { Options option1 = Options.fromTransactionOptions(Options.commitStats()); Options option2 = Options.fromTransactionOptions(Options.commitStats()); - assertTrue(option1.equals(option2)); + assertEquals(option1, option2); } @Test public void testTransactionOptions_withCommitStatsAndOtherOptionAreNotEqual() { Options option1 = Options.fromTransactionOptions(Options.commitStats()); Options option2 = Options.fromQueryOptions(Options.prefetchChunks(10)); - assertFalse(option1.equals(option2)); + assertNotEquals(option1, option2); } @Test diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java index 7a320802f23..5bdb685c8bd 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITAsyncAPITest.java @@ -373,7 +373,7 @@ public ApiFuture apply(TransactionContext transaction, Void input) assertEquals(4L, get(manager.getCommitResponse()).getCommitStats().getMutationCount()); break; } catch (AbortedException e) { - Thread.sleep(e.getRetryDelayInMillis() / 1000); + Thread.sleep(e.getRetryDelayInMillis()); context = manager.resetForRetryAsync(); } } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java index 2346277ce79..3ea4a067717 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionManagerTest.java @@ -235,7 +235,7 @@ public void testTransactionManagerReturnsCommitStats() throws InterruptedExcepti assertEquals(2L, manager.getCommitResponse().getCommitStats().getMutationCount()); break; } catch (AbortedException e) { - Thread.sleep(e.getRetryDelayInMillis() / 1000); + Thread.sleep(e.getRetryDelayInMillis()); transaction = manager.resetForRetry(); } } From 0e341a9148742279ac68a2b49e70fad9e1d196e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Tue, 23 Feb 2021 10:37:47 +0100 Subject: [PATCH 31/33] chore: remove unnecessary changes + JUnit assertions --- google-cloud-spanner/clirr-ignored-differences.xml | 2 +- .../spanner/connection/ConnectionImplTest.java | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/google-cloud-spanner/clirr-ignored-differences.xml b/google-cloud-spanner/clirr-ignored-differences.xml index 42499dc429f..98dd288b28a 100644 --- a/google-cloud-spanner/clirr-ignored-differences.xml +++ b/google-cloud-spanner/clirr-ignored-differences.xml @@ -453,7 +453,7 @@ com/google/cloud/spanner/TransactionContext com.google.api.core.ApiFuture executeUpdateAsync(com.google.cloud.spanner.Statement) - + 7012 diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java index 88346f57674..f2c6213226a 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionImplTest.java @@ -643,11 +643,11 @@ public void testExecuteSetReturnCommitStats() { assertFalse(subject.isReturnCommitStats()); StatementResult result = subject.execute(Statement.of("set return_commit_stats=true")); - assertThat(result.getResultType(), is(equalTo(ResultType.NO_RESULT))); + assertEquals(ResultType.NO_RESULT, result.getResultType()); assertTrue(subject.isReturnCommitStats()); result = subject.execute(Statement.of("set return_commit_stats=false")); - assertThat(result.getResultType(), is(equalTo(ResultType.NO_RESULT))); + assertEquals(ResultType.NO_RESULT, result.getResultType()); assertFalse(subject.isReturnCommitStats()); } } @@ -666,7 +666,7 @@ public void testExecuteSetReturnCommitStatsInvalidValue() { subject.execute(Statement.of("set return_commit_stats=yes")); fail("Missing expected exception"); } catch (SpannerException e) { - assertEquals(e.getErrorCode(), ErrorCode.INVALID_ARGUMENT); + assertEquals(ErrorCode.INVALID_ARGUMENT, e.getErrorCode()); } } } @@ -683,14 +683,14 @@ public void testExecuteGetReturnCommitStats() { StatementResult returnCommitStatsFalse = subject.execute(Statement.of("show variable return_commit_stats")); - assertThat(returnCommitStatsFalse.getResultType(), is(equalTo(ResultType.RESULT_SET))); + assertEquals(ResultType.RESULT_SET, returnCommitStatsFalse.getResultType()); assertTrue(returnCommitStatsFalse.getResultSet().next()); assertFalse(returnCommitStatsFalse.getResultSet().getBoolean("RETURN_COMMIT_STATS")); subject.execute(Statement.of("set return_commit_stats=true")); StatementResult returnCommitStatsTrue = subject.execute(Statement.of("show variable return_commit_stats")); - assertThat(returnCommitStatsTrue.getResultType(), is(equalTo(ResultType.RESULT_SET))); + assertEquals(ResultType.RESULT_SET, returnCommitStatsTrue.getResultType()); assertTrue(returnCommitStatsTrue.getResultSet().next()); assertTrue(returnCommitStatsTrue.getResultSet().getBoolean("RETURN_COMMIT_STATS")); } @@ -837,7 +837,7 @@ public void testExecuteGetCommitResponse() { subject.executeQuery(Statement.of(AbstractConnectionImplTest.SELECT)).next(); subject.commit(); StatementResult response = subject.execute(Statement.of("show variable commit_response")); - assertThat(response.getResultType(), is(equalTo(ResultType.RESULT_SET))); + assertEquals(ResultType.RESULT_SET, response.getResultType()); assertTrue(response.getResultSet().next()); assertNotNull(response.getResultSet().getTimestamp("COMMIT_TIMESTAMP")); assertTrue(response.getResultSet().isNull("MUTATION_COUNT")); @@ -854,7 +854,7 @@ public void testExecuteGetCommitResponse() { subject.executeQuery(Statement.of(AbstractConnectionImplTest.SELECT)).next(); subject.commit(); StatementResult response = subject.execute(Statement.of("show variable commit_response")); - assertThat(response.getResultType(), is(equalTo(ResultType.RESULT_SET))); + assertEquals(ResultType.RESULT_SET, response.getResultType()); assertTrue(response.getResultSet().next()); assertNotNull(response.getResultSet().getTimestamp("COMMIT_TIMESTAMP")); assertFalse(response.getResultSet().isNull("MUTATION_COUNT")); From 7540c3194bb412710bbbe4d2cc677c1d2c6f41fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Tue, 23 Feb 2021 14:34:04 +0100 Subject: [PATCH 32/33] fix: remove reference to overload_delay --- .../cloud/spanner/connection/it/ITCommitResponseTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java index 9850555ae49..91393eed301 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITCommitResponseTest.java @@ -100,7 +100,6 @@ public void testReturnCommitStatsUsingSql() { assertTrue(resultSet.next()); assertNotNull(resultSet.getTimestamp("COMMIT_TIMESTAMP")); assertEquals(2L, resultSet.getLong("MUTATION_COUNT")); - assertNotNull(resultSet.getString("OVERLOAD_DELAY")); assertFalse(resultSet.next()); } } @@ -150,7 +149,6 @@ public void testAutocommitReturnCommitStatsUsingSql() { assertTrue(resultSet.next()); assertNotNull(resultSet.getTimestamp("COMMIT_TIMESTAMP")); assertEquals(2L, resultSet.getLong("MUTATION_COUNT")); - assertNotNull(resultSet.getString("OVERLOAD_DELAY")); assertFalse(resultSet.next()); } } From f86255e690d20229f0b3825b3c353bd6e9e61dda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Wed, 24 Feb 2021 19:22:28 +0100 Subject: [PATCH 33/33] chore: address review comments --- .../cloud/spanner/connection/ConnectionOptions.java | 13 ++++--------- .../spanner/connection/ReadWriteTransaction.java | 6 ++++-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java index b4bea4363bc..ee8e05231ff 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java @@ -185,8 +185,6 @@ public String[] getValidValues() { private static final String USER_AGENT_PROPERTY_NAME = "userAgent"; /** Query optimizer version to use for a connection. */ private static final String OPTIMIZER_VERSION_PROPERTY_NAME = "optimizerVersion"; - /** Return commit stats for read/write transactions. */ - private static final String RETURN_COMMIT_STATS_PROPERTY_NAME = "returnCommitStats"; /** Name of the 'lenientMode' connection property. */ public static final String LENIENT_PROPERTY_NAME = "lenient"; @@ -232,8 +230,7 @@ public String[] getValidValues() { ConnectionProperty.createStringProperty( OPTIMIZER_VERSION_PROPERTY_NAME, "Sets the default query optimizer version to use for this connection."), - ConnectionProperty.createBooleanProperty( - RETURN_COMMIT_STATS_PROPERTY_NAME, "", DEFAULT_RETURN_COMMIT_STATS), + ConnectionProperty.createBooleanProperty("returnCommitStats", "", false), ConnectionProperty.createBooleanProperty( LENIENT_PROPERTY_NAME, "Silently ignore unknown properties in the connection string/properties (true/false)", @@ -643,8 +640,8 @@ static String parseOptimizerVersion(String uri) { @VisibleForTesting static boolean parseReturnCommitStats(String uri) { - String value = parseUriProperty(uri, RETURN_COMMIT_STATS_PROPERTY_NAME); - return value != null ? Boolean.valueOf(value) : DEFAULT_RETURN_COMMIT_STATS; + String value = parseUriProperty(uri, "returnCommitStats"); + return value != null ? Boolean.valueOf(value) : false; } @VisibleForTesting @@ -836,9 +833,7 @@ QueryOptions getQueryOptions() { return queryOptions; } - /** - * The initial returnCommitStats value for connections created by this {@link ConnectionOptions} - */ + /** Whether connections created by this {@link ConnectionOptions} return commit stats. */ public boolean isReturnCommitStats() { return returnCommitStats; } 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 5d8445158ce..c8029ee7b94 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 @@ -271,7 +271,8 @@ private boolean hasCommitResponse() { @Override public Timestamp getCommitTimestamp() { - ConnectionPreconditions.checkState(hasCommitResponse(), "This transaction has not committed."); + ConnectionPreconditions.checkState( + hasCommitResponse(), "This transaction has not been committed."); return get(commitResponseFuture).getCommitTimestamp(); } @@ -282,7 +283,8 @@ public Timestamp getCommitTimestampOrNull() { @Override public CommitResponse getCommitResponse() { - ConnectionPreconditions.checkState(hasCommitResponse(), "This transaction has not committed."); + ConnectionPreconditions.checkState( + hasCommitResponse(), "This transaction has not been committed."); return get(commitResponseFuture); }