|  | // Copyright 2017 Google Inc. | 
|  | // | 
|  | // 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. | 
|  |  | 
|  | syntax = "proto3"; | 
|  |  | 
|  | package google.spanner.v1; | 
|  |  | 
|  | import "google/api/annotations.proto"; | 
|  | import "google/api/auth.proto"; | 
|  | import "google/protobuf/empty.proto"; | 
|  | import "google/protobuf/struct.proto"; | 
|  | import "google/protobuf/timestamp.proto"; | 
|  | import "google/spanner/v1/keys.proto"; | 
|  | import "google/spanner/v1/mutation.proto"; | 
|  | import "google/spanner/v1/result_set.proto"; | 
|  | import "google/spanner/v1/transaction.proto"; | 
|  | import "google/spanner/v1/type.proto"; | 
|  |  | 
|  | option csharp_namespace = "Google.Cloud.Spanner.V1"; | 
|  | option go_package = "google.golang.org/genproto/googleapis/spanner/v1;spanner"; | 
|  | option java_multiple_files = true; | 
|  | option java_outer_classname = "SpannerProto"; | 
|  | option java_package = "com.google.spanner.v1"; | 
|  |  | 
|  |  | 
|  | // Cloud Spanner API | 
|  | // | 
|  | // The Cloud Spanner API can be used to manage sessions and execute | 
|  | // transactions on data stored in Cloud Spanner databases. | 
|  | service Spanner { | 
|  | // Creates a new session. A session can be used to perform | 
|  | // transactions that read and/or modify data in a Cloud Spanner database. | 
|  | // Sessions are meant to be reused for many consecutive | 
|  | // transactions. | 
|  | // | 
|  | // Sessions can only execute one transaction at a time. To execute | 
|  | // multiple concurrent read-write/write-only transactions, create | 
|  | // multiple sessions. Note that standalone reads and queries use a | 
|  | // transaction internally, and count toward the one transaction | 
|  | // limit. | 
|  | // | 
|  | // Cloud Spanner limits the number of sessions that can exist at any given | 
|  | // time; thus, it is a good idea to delete idle and/or unneeded sessions. | 
|  | // Aside from explicit deletes, Cloud Spanner can delete sessions for which no | 
|  | // operations are sent for more than an hour. If a session is deleted, | 
|  | // requests to it return `NOT_FOUND`. | 
|  | // | 
|  | // Idle sessions can be kept alive by sending a trivial SQL query | 
|  | // periodically, e.g., `"SELECT 1"`. | 
|  | rpc CreateSession(CreateSessionRequest) returns (Session) { | 
|  | option (google.api.http) = { post: "/v1/{database=projects/*/instances/*/databases/*}/sessions" body: "" }; | 
|  | } | 
|  |  | 
|  | // Gets a session. Returns `NOT_FOUND` if the session does not exist. | 
|  | // This is mainly useful for determining whether a session is still | 
|  | // alive. | 
|  | rpc GetSession(GetSessionRequest) returns (Session) { | 
|  | option (google.api.http) = { get: "/v1/{name=projects/*/instances/*/databases/*/sessions/*}" }; | 
|  | } | 
|  |  | 
|  | // Ends a session, releasing server resources associated with it. | 
|  | rpc DeleteSession(DeleteSessionRequest) returns (google.protobuf.Empty) { | 
|  | option (google.api.http) = { delete: "/v1/{name=projects/*/instances/*/databases/*/sessions/*}" }; | 
|  | } | 
|  |  | 
|  | // Executes an SQL query, returning all rows in a single reply. This | 
|  | // method cannot be used to return a result set larger than 10 MiB; | 
|  | // if the query yields more data than that, the query fails with | 
|  | // a `FAILED_PRECONDITION` error. | 
|  | // | 
|  | // Queries inside read-write transactions might return `ABORTED`. If | 
|  | // this occurs, the application should restart the transaction from | 
|  | // the beginning. See [Transaction][google.spanner.v1.Transaction] for more details. | 
|  | // | 
|  | // Larger result sets can be fetched in streaming fashion by calling | 
|  | // [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] instead. | 
|  | rpc ExecuteSql(ExecuteSqlRequest) returns (ResultSet) { | 
|  | option (google.api.http) = { post: "/v1/{session=projects/*/instances/*/databases/*/sessions/*}:executeSql" body: "*" }; | 
|  | } | 
|  |  | 
|  | // Like [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], except returns the result | 
|  | // set as a stream. Unlike [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], there | 
|  | // is no limit on the size of the returned result set. However, no | 
|  | // individual row in the result set can exceed 100 MiB, and no | 
|  | // column value can exceed 10 MiB. | 
|  | rpc ExecuteStreamingSql(ExecuteSqlRequest) returns (stream PartialResultSet) { | 
|  | option (google.api.http) = { post: "/v1/{session=projects/*/instances/*/databases/*/sessions/*}:executeStreamingSql" body: "*" }; | 
|  | } | 
|  |  | 
|  | // Reads rows from the database using key lookups and scans, as a | 
|  | // simple key/value style alternative to | 
|  | // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql].  This method cannot be used to | 
|  | // return a result set larger than 10 MiB; if the read matches more | 
|  | // data than that, the read fails with a `FAILED_PRECONDITION` | 
|  | // error. | 
|  | // | 
|  | // Reads inside read-write transactions might return `ABORTED`. If | 
|  | // this occurs, the application should restart the transaction from | 
|  | // the beginning. See [Transaction][google.spanner.v1.Transaction] for more details. | 
|  | // | 
|  | // Larger result sets can be yielded in streaming fashion by calling | 
|  | // [StreamingRead][google.spanner.v1.Spanner.StreamingRead] instead. | 
|  | rpc Read(ReadRequest) returns (ResultSet) { | 
|  | option (google.api.http) = { post: "/v1/{session=projects/*/instances/*/databases/*/sessions/*}:read" body: "*" }; | 
|  | } | 
|  |  | 
|  | // Like [Read][google.spanner.v1.Spanner.Read], except returns the result set as a | 
|  | // stream. Unlike [Read][google.spanner.v1.Spanner.Read], there is no limit on the | 
|  | // size of the returned result set. However, no individual row in | 
|  | // the result set can exceed 100 MiB, and no column value can exceed | 
|  | // 10 MiB. | 
|  | rpc StreamingRead(ReadRequest) returns (stream PartialResultSet) { | 
|  | option (google.api.http) = { post: "/v1/{session=projects/*/instances/*/databases/*/sessions/*}:streamingRead" body: "*" }; | 
|  | } | 
|  |  | 
|  | // Begins a new transaction. This step can often be skipped: | 
|  | // [Read][google.spanner.v1.Spanner.Read], [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and | 
|  | // [Commit][google.spanner.v1.Spanner.Commit] can begin a new transaction as a | 
|  | // side-effect. | 
|  | rpc BeginTransaction(BeginTransactionRequest) returns (Transaction) { | 
|  | option (google.api.http) = { post: "/v1/{session=projects/*/instances/*/databases/*/sessions/*}:beginTransaction" body: "*" }; | 
|  | } | 
|  |  | 
|  | // Commits a transaction. The request includes the mutations to be | 
|  | // applied to rows in the database. | 
|  | // | 
|  | // `Commit` might return an `ABORTED` error. This can occur at any time; | 
|  | // commonly, the cause is conflicts with concurrent | 
|  | // transactions. However, it can also happen for a variety of other | 
|  | // reasons. If `Commit` returns `ABORTED`, the caller should re-attempt | 
|  | // the transaction from the beginning, re-using the same session. | 
|  | rpc Commit(CommitRequest) returns (CommitResponse) { | 
|  | option (google.api.http) = { post: "/v1/{session=projects/*/instances/*/databases/*/sessions/*}:commit" body: "*" }; | 
|  | } | 
|  |  | 
|  | // Rolls back a transaction, releasing any locks it holds. It is a good | 
|  | // idea to call this for any transaction that includes one or more | 
|  | // [Read][google.spanner.v1.Spanner.Read] or [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] requests and | 
|  | // ultimately decides not to commit. | 
|  | // | 
|  | // `Rollback` returns `OK` if it successfully aborts the transaction, the | 
|  | // transaction was already aborted, or the transaction is not | 
|  | // found. `Rollback` never returns `ABORTED`. | 
|  | rpc Rollback(RollbackRequest) returns (google.protobuf.Empty) { | 
|  | option (google.api.http) = { post: "/v1/{session=projects/*/instances/*/databases/*/sessions/*}:rollback" body: "*" }; | 
|  | } | 
|  | } | 
|  |  | 
|  | // The request for [CreateSession][google.spanner.v1.Spanner.CreateSession]. | 
|  | message CreateSessionRequest { | 
|  | // Required. The database in which the new session is created. | 
|  | string database = 1; | 
|  | } | 
|  |  | 
|  | // A session in the Cloud Spanner API. | 
|  | message Session { | 
|  | // Required. The name of the session. | 
|  | string name = 1; | 
|  | } | 
|  |  | 
|  | // The request for [GetSession][google.spanner.v1.Spanner.GetSession]. | 
|  | message GetSessionRequest { | 
|  | // Required. The name of the session to retrieve. | 
|  | string name = 1; | 
|  | } | 
|  |  | 
|  | // The request for [DeleteSession][google.spanner.v1.Spanner.DeleteSession]. | 
|  | message DeleteSessionRequest { | 
|  | // Required. The name of the session to delete. | 
|  | string name = 1; | 
|  | } | 
|  |  | 
|  | // The request for [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and | 
|  | // [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql]. | 
|  | message ExecuteSqlRequest { | 
|  | // Mode in which the query must be processed. | 
|  | enum QueryMode { | 
|  | // The default mode where only the query result, without any information | 
|  | // about the query plan is returned. | 
|  | NORMAL = 0; | 
|  |  | 
|  | // This mode returns only the query plan, without any result rows or | 
|  | // execution statistics information. | 
|  | PLAN = 1; | 
|  |  | 
|  | // This mode returns both the query plan and the execution statistics along | 
|  | // with the result rows. | 
|  | PROFILE = 2; | 
|  | } | 
|  |  | 
|  | // Required. The session in which the SQL query should be performed. | 
|  | string session = 1; | 
|  |  | 
|  | // The transaction to use. If none is provided, the default is a | 
|  | // temporary read-only transaction with strong concurrency. | 
|  | TransactionSelector transaction = 2; | 
|  |  | 
|  | // Required. The SQL query string. | 
|  | string sql = 3; | 
|  |  | 
|  | // The SQL query string can contain parameter placeholders. A parameter | 
|  | // placeholder consists of `'@'` followed by the parameter | 
|  | // name. Parameter names consist of any combination of letters, | 
|  | // numbers, and underscores. | 
|  | // | 
|  | // Parameters can appear anywhere that a literal value is expected.  The same | 
|  | // parameter name can be used more than once, for example: | 
|  | //   `"WHERE id > @msg_id AND id < @msg_id + 100"` | 
|  | // | 
|  | // It is an error to execute an SQL query with unbound parameters. | 
|  | // | 
|  | // Parameter values are specified using `params`, which is a JSON | 
|  | // object whose keys are parameter names, and whose values are the | 
|  | // corresponding parameter values. | 
|  | google.protobuf.Struct params = 4; | 
|  |  | 
|  | // It is not always possible for Cloud Spanner to infer the right SQL type | 
|  | // from a JSON value.  For example, values of type `BYTES` and values | 
|  | // of type `STRING` both appear in [params][google.spanner.v1.ExecuteSqlRequest.params] as JSON strings. | 
|  | // | 
|  | // In these cases, `param_types` can be used to specify the exact | 
|  | // SQL type for some or all of the SQL query parameters. See the | 
|  | // definition of [Type][google.spanner.v1.Type] for more information | 
|  | // about SQL types. | 
|  | map<string, Type> param_types = 5; | 
|  |  | 
|  | // If this request is resuming a previously interrupted SQL query | 
|  | // execution, `resume_token` should be copied from the last | 
|  | // [PartialResultSet][google.spanner.v1.PartialResultSet] yielded before the interruption. Doing this | 
|  | // enables the new SQL query execution to resume where the last one left | 
|  | // off. The rest of the request parameters must exactly match the | 
|  | // request that yielded this token. | 
|  | bytes resume_token = 6; | 
|  |  | 
|  | // Used to control the amount of debugging information returned in | 
|  | // [ResultSetStats][google.spanner.v1.ResultSetStats]. | 
|  | QueryMode query_mode = 7; | 
|  | } | 
|  |  | 
|  | // The request for [Read][google.spanner.v1.Spanner.Read] and | 
|  | // [StreamingRead][google.spanner.v1.Spanner.StreamingRead]. | 
|  | message ReadRequest { | 
|  | // Required. The session in which the read should be performed. | 
|  | string session = 1; | 
|  |  | 
|  | // The transaction to use. If none is provided, the default is a | 
|  | // temporary read-only transaction with strong concurrency. | 
|  | TransactionSelector transaction = 2; | 
|  |  | 
|  | // Required. The name of the table in the database to be read. | 
|  | string table = 3; | 
|  |  | 
|  | // If non-empty, the name of an index on [table][google.spanner.v1.ReadRequest.table]. This index is | 
|  | // used instead of the table primary key when interpreting [key_set][google.spanner.v1.ReadRequest.key_set] | 
|  | // and sorting result rows. See [key_set][google.spanner.v1.ReadRequest.key_set] for further information. | 
|  | string index = 4; | 
|  |  | 
|  | // The columns of [table][google.spanner.v1.ReadRequest.table] to be returned for each row matching | 
|  | // this request. | 
|  | repeated string columns = 5; | 
|  |  | 
|  | // Required. `key_set` identifies the rows to be yielded. `key_set` names the | 
|  | // primary keys of the rows in [table][google.spanner.v1.ReadRequest.table] to be yielded, unless [index][google.spanner.v1.ReadRequest.index] | 
|  | // is present. If [index][google.spanner.v1.ReadRequest.index] is present, then [key_set][google.spanner.v1.ReadRequest.key_set] instead names | 
|  | // index keys in [index][google.spanner.v1.ReadRequest.index]. | 
|  | // | 
|  | // Rows are yielded in table primary key order (if [index][google.spanner.v1.ReadRequest.index] is empty) | 
|  | // or index key order (if [index][google.spanner.v1.ReadRequest.index] is non-empty). | 
|  | // | 
|  | // It is not an error for the `key_set` to name rows that do not | 
|  | // exist in the database. Read yields nothing for nonexistent rows. | 
|  | KeySet key_set = 6; | 
|  |  | 
|  | // If greater than zero, only the first `limit` rows are yielded. If `limit` | 
|  | // is zero, the default is no limit. | 
|  | int64 limit = 8; | 
|  |  | 
|  | // If this request is resuming a previously interrupted read, | 
|  | // `resume_token` should be copied from the last | 
|  | // [PartialResultSet][google.spanner.v1.PartialResultSet] yielded before the interruption. Doing this | 
|  | // enables the new read to resume where the last read left off. The | 
|  | // rest of the request parameters must exactly match the request | 
|  | // that yielded this token. | 
|  | bytes resume_token = 9; | 
|  | } | 
|  |  | 
|  | // The request for [BeginTransaction][google.spanner.v1.Spanner.BeginTransaction]. | 
|  | message BeginTransactionRequest { | 
|  | // Required. The session in which the transaction runs. | 
|  | string session = 1; | 
|  |  | 
|  | // Required. Options for the new transaction. | 
|  | TransactionOptions options = 2; | 
|  | } | 
|  |  | 
|  | // The request for [Commit][google.spanner.v1.Spanner.Commit]. | 
|  | message CommitRequest { | 
|  | // Required. The session in which the transaction to be committed is running. | 
|  | string session = 1; | 
|  |  | 
|  | // Required. The transaction in which to commit. | 
|  | oneof transaction { | 
|  | // Commit a previously-started transaction. | 
|  | bytes transaction_id = 2; | 
|  |  | 
|  | // Execute mutations in a temporary transaction. Note that unlike | 
|  | // commit of a previously-started transaction, commit with a | 
|  | // temporary transaction is non-idempotent. That is, if the | 
|  | // `CommitRequest` is sent to Cloud Spanner more than once (for | 
|  | // instance, due to retries in the application, or in the | 
|  | // transport library), it is possible that the mutations are | 
|  | // executed more than once. If this is undesirable, use | 
|  | // [BeginTransaction][google.spanner.v1.Spanner.BeginTransaction] and | 
|  | // [Commit][google.spanner.v1.Spanner.Commit] instead. | 
|  | TransactionOptions single_use_transaction = 3; | 
|  | } | 
|  |  | 
|  | // The mutations to be executed when this transaction commits. All | 
|  | // mutations are applied atomically, in the order they appear in | 
|  | // this list. | 
|  | repeated Mutation mutations = 4; | 
|  | } | 
|  |  | 
|  | // The response for [Commit][google.spanner.v1.Spanner.Commit]. | 
|  | message CommitResponse { | 
|  | // The Cloud Spanner timestamp at which the transaction committed. | 
|  | google.protobuf.Timestamp commit_timestamp = 1; | 
|  | } | 
|  |  | 
|  | // The request for [Rollback][google.spanner.v1.Spanner.Rollback]. | 
|  | message RollbackRequest { | 
|  | // Required. The session in which the transaction to roll back is running. | 
|  | string session = 1; | 
|  |  | 
|  | // Required. The transaction to roll back. | 
|  | bytes transaction_id = 2; | 
|  | } |