// Copyright 2024 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. syntax = "proto3"; package google.spanner.executor.v1; import "google/api/client.proto"; import "google/api/field_behavior.proto"; import "google/longrunning/operations.proto"; import "google/protobuf/timestamp.proto"; import "google/rpc/status.proto"; import "google/spanner/admin/database/v1/backup.proto"; import "google/spanner/admin/database/v1/common.proto"; import "google/spanner/admin/database/v1/spanner_database_admin.proto"; import "google/spanner/admin/instance/v1/spanner_instance_admin.proto"; import "google/spanner/v1/spanner.proto"; import "google/spanner/v1/type.proto"; option go_package = "cloud.google.com/go/spanner/executor/apiv1/executorpb;executorpb"; option java_multiple_files = true; option java_outer_classname = "CloudExecutorProto"; option java_package = "com.google.spanner.executor.v1"; // Service that executes SpannerActions asynchronously. service SpannerExecutorProxy { option (google.api.default_host) = "spanner-cloud-executor.googleapis.com"; // ExecuteActionAsync is a streaming call that starts executing a new Spanner // action. // // For each request, the server will reply with one or more responses, but // only the last response will contain status in the outcome. // // Responses can be matched to requests by action_id. It is allowed to have // multiple actions in flight--in that case, actions are be executed in // parallel. rpc ExecuteActionAsync(stream SpannerAsyncActionRequest) returns (stream SpannerAsyncActionResponse) {} } // Request to executor service that start a new Spanner action. message SpannerAsyncActionRequest { // Action id to uniquely identify this action request. int32 action_id = 1; // The actual SpannerAction to perform. SpannerAction action = 2; } // Response from executor service. message SpannerAsyncActionResponse { // Action id corresponds to the request. int32 action_id = 1; // If action results are split into multiple responses, only the last response // can and should contain status. SpannerActionOutcome outcome = 2; } // SpannerAction defines a primitive action that can be performed against // Spanner, such as begin or commit a transaction, or perform a read or // mutation. message SpannerAction { // Database against which to perform action. // In a context where a series of actions take place, an action may omit // database path if it applies to the same database as the previous action. string database_path = 1; // Configuration options for Spanner backend SpannerOptions spanner_options = 2; // Action represents a spanner action kind, there will only be one action kind // per SpannerAction. oneof action { // Action to start a transaction. StartTransactionAction start = 10; // Action to finish a transaction. FinishTransactionAction finish = 11; // Action to do a normal read. ReadAction read = 20; // Action to do a query. QueryAction query = 21; // Action to buffer a mutation. MutationAction mutation = 22; // Action to a DML. DmlAction dml = 23; // Action to a batch DML. BatchDmlAction batch_dml = 24; // Action to write a mutation. WriteMutationsAction write = 25; // Action to a partitioned update. PartitionedUpdateAction partitioned_update = 27; // Action that contains any administrative operation, like database, // instance manipulation. AdminAction admin = 30; // Action to start a batch transaction. StartBatchTransactionAction start_batch_txn = 40; // Action to close a batch transaction. CloseBatchTransactionAction close_batch_txn = 41; // Action to generate database partitions for batch read. GenerateDbPartitionsForReadAction generate_db_partitions_read = 42; // Action to generate database partitions for batch query. GenerateDbPartitionsForQueryAction generate_db_partitions_query = 43; // Action to execute batch actions on generated partitions. ExecutePartitionAction execute_partition = 44; // Action to execute change stream query. ExecuteChangeStreamQuery execute_change_stream_query = 50; // Query cancellation action for testing the cancellation of a query. QueryCancellationAction query_cancellation = 51; } } // A single read request. message ReadAction { // The table to read at. string table = 1; // The index to read at if it's an index read. optional string index = 2; // List of columns must begin with the key columns used for the read. repeated string column = 3; // Keys for performing this read. KeySet keys = 4; // Limit on number of rows to read. If set, must be positive. int32 limit = 5; } // A SQL query request. message QueryAction { // Parameter that bind to placeholders in the SQL string message Parameter { // Name of the parameter (with no leading @). string name = 1; // Type of the parameter. google.spanner.v1.Type type = 2; // Value of the parameter. Value value = 3; } // The SQL string. string sql = 1; // Parameters for the SQL string. repeated Parameter params = 2; } // A single DML statement. message DmlAction { // DML statement. QueryAction update = 1; // Whether to autocommit the transaction after executing the DML statement, // if the Executor supports autocommit. optional bool autocommit_if_supported = 2; } // Batch of DML statements invoked using batched execution. message BatchDmlAction { // DML statements. repeated QueryAction updates = 1; } // Value represents a single value that can be read or written to/from // Spanner. message Value { // Exactly one of the following fields will be present. oneof value_type { // If is_null is set, then this value is null. bool is_null = 1; // Int type value. It's used for all integer number types, like int32 and // int64. int64 int_value = 2; // Bool type value. bool bool_value = 3; // Double type value. It's used for all float point types, like float and // double. double double_value = 4; // Bytes type value, stored in CORD. It's also used for PROTO type value. bytes bytes_value = 5; // String type value, stored in CORD. string string_value = 6; // Struct type value. It contains a ValueList representing the values in // this struct. ValueList struct_value = 7; // Timestamp type value. google.protobuf.Timestamp timestamp_value = 8; // Date type value. Date is specified as a number of days since Unix epoch. int32 date_days_value = 9; // If set, holds the sentinel value for the transaction CommitTimestamp. bool is_commit_timestamp = 10; // Array type value. The underlying Valuelist should have values that have // the same type. ValueList array_value = 11; } // Type of array element. Only set if value is an array. optional google.spanner.v1.Type array_type = 12; } // KeyRange represents a range of rows in a table or index. // // A range has a start key and an end key. These keys can be open or // closed, indicating if the range includes rows with that key. // // Keys are represented by "ValueList", where the ith value in the list // corresponds to the ith component of the table or index primary key. message KeyRange { // Type controls whether "start" and "limit" are open or closed. By default, // "start" is closed, and "limit" is open. enum Type { // "TYPE_UNSPECIFIED" is equivalent to "CLOSED_OPEN". TYPE_UNSPECIFIED = 0; // [start,limit] CLOSED_CLOSED = 1; // [start,limit) CLOSED_OPEN = 2; // (start,limit] OPEN_CLOSED = 3; // (start,limit) OPEN_OPEN = 4; } // "start" and "limit" must have the same number of key parts, // though they may name only a prefix of the table or index key. // The start key of this KeyRange. ValueList start = 1; // The end key of this KeyRange. ValueList limit = 2; // "start" and "limit" type for this KeyRange. optional Type type = 3; } // KeySet defines a collection of Spanner keys and/or key ranges. All // the keys are expected to be in the same table. The keys need not be // sorted in any particular way. message KeySet { // A list of specific keys. Entries in "keys" should have exactly as // many elements as there are columns in the primary or index key // with which this "KeySet" is used. repeated ValueList point = 1; // A list of key ranges. repeated KeyRange range = 2; // For convenience "all" can be set to "true" to indicate that this // "KeySet" matches all keys in the table or index. Note that any keys // specified in "keys" or "ranges" are only yielded once. bool all = 3; } // List of values. message ValueList { // Values contained in this ValueList. repeated Value value = 1; } // A single mutation request. message MutationAction { // Arguments to Insert, InsertOrUpdate, and Replace operations. message InsertArgs { // The names of the columns to be written. repeated string column = 1; // Type information for the "values" entries below. repeated google.spanner.v1.Type type = 2; // The values to be written. repeated ValueList values = 3; } // Arguments to Update. message UpdateArgs { // The columns to be updated. Identical to InsertArgs.column. repeated string column = 1; // Type information for "values". Identical to InsertArgs.type. repeated google.spanner.v1.Type type = 2; // The values to be updated. Identical to InsertArgs.values. repeated ValueList values = 3; } // Mod represents the write action that will be perform to a table. Each mod // will specify exactly one action, from insert, update, insert_or_update, // replace and delete. message Mod { // The table to write. string table = 1; // Exactly one of the remaining elements may be present. // Insert new rows into "table". InsertArgs insert = 2; // Update columns stored in existing rows of "table". UpdateArgs update = 3; // Insert or update existing rows of "table". InsertArgs insert_or_update = 4; // Replace existing rows of "table". InsertArgs replace = 5; // Delete rows from "table". KeySet delete_keys = 6; } // Mods that contained in this mutation. repeated Mod mod = 1; } // WriteMutationAction defines an action of flushing the mutation so they // are visible to subsequent operations in the transaction. message WriteMutationsAction { // The mutation to write. MutationAction mutation = 1; } // PartitionedUpdateAction defines an action to execute a partitioned DML // which runs different partitions in parallel. message PartitionedUpdateAction { message ExecutePartitionedUpdateOptions { // RPC Priority optional google.spanner.v1.RequestOptions.Priority rpc_priority = 1; // Transaction tag optional string tag = 2; } // Options for partitioned update. optional ExecutePartitionedUpdateOptions options = 1; // Partitioned dml query. QueryAction update = 2; } // StartTransactionAction defines an action of initializing a transaction. message StartTransactionAction { // Concurrency is for read-only transactions and must be omitted for // read-write transactions. optional Concurrency concurrency = 1; // Metadata about tables and columns that will be involved in this // transaction. It is to convert values of key parts correctly. repeated TableMetadata table = 2; // Transaction_seed contains workid and op pair for this transaction, used for // testing. string transaction_seed = 3; // Execution options (e.g., whether transaction is opaque, optimistic). optional TransactionExecutionOptions execution_options = 4; } // Concurrency for read-only transactions. message Concurrency { // Concurrency mode set for read-only transactions, exactly one mode below // should be set. oneof concurrency_mode { // Indicates a read at a consistent timestamp that is specified relative to // now. That is, if the caller has specified an exact staleness of s // seconds, we will read at now - s. double staleness_seconds = 1; // Indicates a boundedly stale read that reads at a timestamp >= T. int64 min_read_timestamp_micros = 2; // Indicates a boundedly stale read that is at most N seconds stale. double max_staleness_seconds = 3; // Indicates a read at a consistent timestamp. int64 exact_timestamp_micros = 4; // Indicates a strong read, must only be set to true, or unset. bool strong = 5; // Indicates a batch read, must only be set to true, or unset. bool batch = 6; } // True if exact_timestamp_micros is set, and the chosen timestamp is that of // a snapshot epoch. bool snapshot_epoch_read = 7; // If set, this is a snapshot epoch read constrained to read only the // specified log scope root table, and its children. Will not be set for full // database epochs. string snapshot_epoch_root_table = 8; // Set only when batch is true. int64 batch_read_timestamp_micros = 9; } // TableMetadata contains metadata of a single table. message TableMetadata { // Table name. string name = 1; // Columns, in the same order as in the schema. repeated ColumnMetadata column = 2; // Keys, in order. Column name is currently not populated. repeated ColumnMetadata key_column = 3; } // ColumnMetadata represents metadata of a single column. message ColumnMetadata { // Column name. string name = 1; // Column type. google.spanner.v1.Type type = 2; } // Options for executing the transaction. message TransactionExecutionOptions { // Whether optimistic concurrency should be used to execute this transaction. bool optimistic = 1; } // FinishTransactionAction defines an action of finishing a transaction. message FinishTransactionAction { // Mode indicates how the transaction should be finished. enum Mode { // "MODE_UNSPECIFIED" is equivalent to "COMMIT". MODE_UNSPECIFIED = 0; // Commit the transaction. COMMIT = 1; // Drop the transaction without committing it. ABANDON = 2; } // Defines how exactly the transaction should be completed, e.g. with // commit or abortion. Mode mode = 1; } // AdminAction defines all the cloud spanner admin actions, including // instance/database admin ops, backup ops and operation actions. message AdminAction { // Exactly one of the actions below will be performed in AdminAction. oneof action { // Action that creates a user instance config. CreateUserInstanceConfigAction create_user_instance_config = 1; // Action that updates a user instance config. UpdateUserInstanceConfigAction update_user_instance_config = 2; // Action that deletes a user instance config. DeleteUserInstanceConfigAction delete_user_instance_config = 3; // Action that gets a user instance config. GetCloudInstanceConfigAction get_cloud_instance_config = 4; // Action that lists user instance configs. ListCloudInstanceConfigsAction list_instance_configs = 5; // Action that creates a Cloud Spanner instance. CreateCloudInstanceAction create_cloud_instance = 6; // Action that updates a Cloud Spanner instance. UpdateCloudInstanceAction update_cloud_instance = 7; // Action that deletes a Cloud Spanner instance. DeleteCloudInstanceAction delete_cloud_instance = 8; // Action that lists Cloud Spanner instances. ListCloudInstancesAction list_cloud_instances = 9; // Action that retrieves a Cloud Spanner instance. GetCloudInstanceAction get_cloud_instance = 10; // Action that creates a Cloud Spanner database. CreateCloudDatabaseAction create_cloud_database = 11; // Action that updates the schema of a Cloud Spanner database. UpdateCloudDatabaseDdlAction update_cloud_database_ddl = 12; // Action that updates the schema of a Cloud Spanner database. UpdateCloudDatabaseAction update_cloud_database = 27; // Action that drops a Cloud Spanner database. DropCloudDatabaseAction drop_cloud_database = 13; // Action that lists Cloud Spanner databases. ListCloudDatabasesAction list_cloud_databases = 14; // Action that lists Cloud Spanner database operations. ListCloudDatabaseOperationsAction list_cloud_database_operations = 15; // Action that restores a Cloud Spanner database from a backup. RestoreCloudDatabaseAction restore_cloud_database = 16; // Action that gets a Cloud Spanner database. GetCloudDatabaseAction get_cloud_database = 17; // Action that creates a Cloud Spanner database backup. CreateCloudBackupAction create_cloud_backup = 18; // Action that copies a Cloud Spanner database backup. CopyCloudBackupAction copy_cloud_backup = 19; // Action that gets a Cloud Spanner database backup. GetCloudBackupAction get_cloud_backup = 20; // Action that updates a Cloud Spanner database backup. UpdateCloudBackupAction update_cloud_backup = 21; // Action that deletes a Cloud Spanner database backup. DeleteCloudBackupAction delete_cloud_backup = 22; // Action that lists Cloud Spanner database backups. ListCloudBackupsAction list_cloud_backups = 23; // Action that lists Cloud Spanner database backup operations. ListCloudBackupOperationsAction list_cloud_backup_operations = 24; // Action that gets an operation. GetOperationAction get_operation = 25; // Action that cancels an operation. CancelOperationAction cancel_operation = 26; // Action that changes quorum of a Cloud Spanner database. ChangeQuorumCloudDatabaseAction change_quorum_cloud_database = 28; } } // Action that creates a user instance config. message CreateUserInstanceConfigAction { // User instance config ID (not path), e.g. "custom-config". string user_config_id = 1; // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 2; // Base config ID, e.g. "test-config". string base_config_id = 3; // Replicas that should be included in the user config. repeated google.spanner.admin.instance.v1.ReplicaInfo replicas = 4; } // Action that updates a user instance config. message UpdateUserInstanceConfigAction { // User instance config ID (not path), e.g. "custom-config". string user_config_id = 1; // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 2; // The descriptive name for this instance config as it appears in UIs. optional string display_name = 3; // labels. map labels = 4; } // Action that gets a user instance config. message GetCloudInstanceConfigAction { // Instance config ID (not path), e.g. "custom-config". string instance_config_id = 1; // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 2; } // Action that deletes a user instance configs. message DeleteUserInstanceConfigAction { // User instance config ID (not path), e.g. "custom-config". string user_config_id = 1; // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 2; } // Action that lists user instance configs. message ListCloudInstanceConfigsAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Number of instance configs to be returned in the response. If 0 or // less, defaults to the server's maximum allowed page size. optional int32 page_size = 2; // If non-empty, "page_token" should contain a next_page_token // from a previous ListInstanceConfigsResponse to the same "parent". optional string page_token = 3; } // Action that creates a Cloud Spanner instance. message CreateCloudInstanceAction { // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 1; // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 2; // Instance config ID, e.g. "test-config". string instance_config_id = 3; // Number of nodes (processing_units should not be set or set to 0 if used). optional int32 node_count = 4; // Number of processing units (node_count should be set to 0 if used). optional int32 processing_units = 6; // The autoscaling config for this instance. If non-empty, an autoscaling // instance will be created (processing_units and node_count should be set to // 0 if used). optional google.spanner.admin.instance.v1.AutoscalingConfig autoscaling_config = 7; // labels. map labels = 5; } // Action that updates a Cloud Spanner instance. message UpdateCloudInstanceAction { // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 1; // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 2; // The descriptive name for this instance as it appears in UIs. // Must be unique per project and between 4 and 30 characters in length. optional string display_name = 3; // The number of nodes allocated to this instance. At most one of either // node_count or processing_units should be present in the message. optional int32 node_count = 4; // The number of processing units allocated to this instance. At most one of // processing_units or node_count should be present in the message. optional int32 processing_units = 5; // The autoscaling config for this instance. If non-empty, this instance is // using autoscaling (processing_units and node_count should be set to // 0 if used). optional google.spanner.admin.instance.v1.AutoscalingConfig autoscaling_config = 7; // labels. map labels = 6; } // Action that deletes a Cloud Spanner instance. message DeleteCloudInstanceAction { // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 1; // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 2; } // Action that creates a Cloud Spanner database. message CreateCloudDatabaseAction { // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 1; // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 2; // Cloud database ID (not full path), e.g. "db0". string database_id = 3; // SDL statements to apply to the new database. repeated string sdl_statement = 4; // The KMS key used to encrypt the database to be created if the database // should be CMEK protected. google.spanner.admin.database.v1.EncryptionConfig encryption_config = 5; // Optional SQL dialect (GOOGLESQL or POSTGRESQL). Default: GOOGLESQL. optional string dialect = 6; optional bytes proto_descriptors = 7; } // Action that updates the schema of a Cloud Spanner database. message UpdateCloudDatabaseDdlAction { // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 1; // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 2; // Cloud database ID (not full path), e.g. "db0". string database_id = 3; // SDL statements to apply to the database. repeated string sdl_statement = 4; // Op ID can be used to track progress of the update. If set, it must be // unique per database. If not set, Cloud Spanner will generate operation ID // automatically. string operation_id = 5; optional bytes proto_descriptors = 6; } // Action that updates a Cloud Spanner database. message UpdateCloudDatabaseAction { // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 1; // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 2; // Cloud database name (not full path), e.g. "db0". string database_name = 3; // Updated value of enable_drop_protection, this is the only field that has // supported to be updated. bool enable_drop_protection = 4; } // Action that drops a Cloud Spanner database. message DropCloudDatabaseAction { // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 1; // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 2; // Cloud database ID (not full path), e.g. "db0". string database_id = 3; } // Action that changes quorum of a Cloud Spanner database. message ChangeQuorumCloudDatabaseAction { // The fully qualified uri of the database whose quorum has to be changed. optional string database_uri = 1; // The locations of the serving regions, e.g. "asia-south1". repeated string serving_locations = 2; } // Action that lists Cloud Spanner databases. message ListCloudDatabasesAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Cloud instance ID (not path) to list databases from, e.g. "test-instance". string instance_id = 2; // Number of databases to be returned in the response. If 0 or // less, defaults to the server's maximum allowed page size. int32 page_size = 3; // If non-empty, "page_token" should contain a next_page_token // from a previous ListDatabasesResponse to the same "parent" // and with the same "filter". string page_token = 4; } // Action that lists Cloud Spanner databases. message ListCloudInstancesAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // A filter expression that filters what operations are returned in the // response. // The expression must specify the field name, a comparison operator, // and the value that you want to use for filtering. // Refer spanner_instance_admin.proto.ListInstancesRequest for // detail. optional string filter = 2; // Number of instances to be returned in the response. If 0 or // less, defaults to the server's maximum allowed page size. optional int32 page_size = 3; // If non-empty, "page_token" should contain a next_page_token // from a previous ListInstancesResponse to the same "parent" // and with the same "filter". optional string page_token = 4; } // Action that retrieves a Cloud Spanner instance. message GetCloudInstanceAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Cloud instance ID (not path) to retrieve the instance from, // e.g. "test-instance". string instance_id = 2; } // Action that lists Cloud Spanner database operations. message ListCloudDatabaseOperationsAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Cloud instance ID (not path) to list database operations from, // e.g. "test-instance". string instance_id = 2; // A filter expression that filters what operations are returned in the // response. // The expression must specify the field name, a comparison operator, // and the value that you want to use for filtering. // Refer spanner_database_admin.proto.ListDatabaseOperationsRequest for // detail. string filter = 3; // Number of databases to be returned in the response. If 0 or // less, defaults to the server's maximum allowed page size. int32 page_size = 4; // If non-empty, "page_token" should contain a next_page_token // from a previous ListDatabaseOperationsResponse to the same "parent" // and with the same "filter". string page_token = 5; } // Action that restores a Cloud Spanner database from a backup. message RestoreCloudDatabaseAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Cloud instance ID (not path) containing the backup, e.g. "backup-instance". string backup_instance_id = 2; // The id of the backup from which to restore, e.g. "test-backup". string backup_id = 3; // Cloud instance ID (not path) containing the database, e.g. // "database-instance". string database_instance_id = 4; // The id of the database to create and restore to, e.g. "db0". Note that this // database must not already exist. string database_id = 5; // The KMS key(s) used to encrypt the restored database to be created if the // restored database should be CMEK protected. google.spanner.admin.database.v1.EncryptionConfig encryption_config = 7; } // Action that gets a Cloud Spanner database. message GetCloudDatabaseAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 2; // The id of the database to get, e.g. "db0". string database_id = 3; } // Action that creates a Cloud Spanner database backup. message CreateCloudBackupAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 2; // The id of the backup to be created, e.g. "test-backup". string backup_id = 3; // The id of the database from which this backup was // created, e.g. "db0". Note that this needs to be in the // same instance as the backup. string database_id = 4; // Output only. The expiration time of the backup, which must be at least 6 // hours and at most 366 days from the time the request is received. google.protobuf.Timestamp expire_time = 5 [(google.api.field_behavior) = OUTPUT_ONLY]; // The version time of the backup, which must be within the time range of // [earliest_version_time, NOW], where earliest_version_time is retrieved by // cloud spanner frontend API (See details: go/cs-pitr-lite-design). optional google.protobuf.Timestamp version_time = 6; // The KMS key(s) used to encrypt the backup to be created if the backup // should be CMEK protected. google.spanner.admin.database.v1.EncryptionConfig encryption_config = 7; } // Action that copies a Cloud Spanner database backup. message CopyCloudBackupAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 2; // The id of the backup to be created, e.g. "test-backup". string backup_id = 3; // The fully qualified uri of the source backup from which this // backup was copied. eg. // "projects//instances//backups/". string source_backup = 4; // Output only. The expiration time of the backup, which must be at least 6 // hours and at most 366 days from the time the request is received. google.protobuf.Timestamp expire_time = 5 [(google.api.field_behavior) = OUTPUT_ONLY]; } // Action that gets a Cloud Spanner database backup. message GetCloudBackupAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 2; // The id of the backup to get, e.g. "test-backup". string backup_id = 3; } // Action that updates a Cloud Spanner database backup. message UpdateCloudBackupAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 2; // The id of the backup to update, e.g. "test-backup". string backup_id = 3; // Output only. Updated value of expire_time, this is the only field // that supported to be updated. google.protobuf.Timestamp expire_time = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; } // Action that deletes a Cloud Spanner database backup. message DeleteCloudBackupAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Cloud instance ID (not path), e.g. "test-instance". string instance_id = 2; // The id of the backup to delete, e.g. "test-backup". string backup_id = 3; } // Action that lists Cloud Spanner database backups. message ListCloudBackupsAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Cloud instance ID (not path) to list backups from, e.g. "test-instance". string instance_id = 2; // A filter expression that filters backups listed in the response. // The expression must specify the field name, a comparison operator, // and the value that you want to use for filtering. // Refer backup.proto.ListBackupsRequest for detail. string filter = 3; // Number of backups to be returned in the response. If 0 or // less, defaults to the server's maximum allowed page size. int32 page_size = 4; // If non-empty, "page_token" should contain a next_page_token // from a previous ListBackupsResponse to the same "parent" // and with the same "filter". string page_token = 5; } // Action that lists Cloud Spanner database backup operations. message ListCloudBackupOperationsAction { // Cloud project ID, e.g. "spanner-cloud-systest". string project_id = 1; // Cloud instance ID (not path) to list backup operations from, // e.g. "test-instance". string instance_id = 2; // A filter expression that filters what operations are returned in the // response. // The expression must specify the field name, a comparison operator, // and the value that you want to use for filtering. // Refer backup.proto.ListBackupOperationsRequest for detail. string filter = 3; // Number of backups to be returned in the response. If 0 or // less, defaults to the server's maximum allowed page size. int32 page_size = 4; // If non-empty, "page_token" should contain a next_page_token // from a previous ListBackupOperationsResponse to the same "parent" // and with the same "filter". string page_token = 5; } // Action that gets an operation. message GetOperationAction { // The name of the operation resource. string operation = 1; } // Query cancellation action defines the long running query and the cancel query // format depening on the Cloud database dialect. message QueryCancellationAction { // Long running query. string long_running_sql = 1; // Format of the cancel query for the cloud database dialect. string cancel_query = 2; } // Action that cancels an operation. message CancelOperationAction { // The name of the operation resource to be cancelled. string operation = 1; } // Starts a batch read-only transaction in executor. Successful outcomes of this // action will contain batch_txn_id--the identificator that can be used to start // the same transaction in other Executors to parallelize partition processing. // // Example of a batch read flow: // 1. Start batch transaction with a timestamp (StartBatchTransactionAction) // 2. Generate database partitions for a read or query // (GenerateDbPartitionsForReadAction/GenerateDbPartitionsForQueryAction) // 3. Call ExecutePartitionAction for some or all partitions, process rows // 4. Clean up the transaction (CloseBatchTransactionAction). // // More sophisticated example, with parallel processing: // 1. Start batch transaction with a timestamp (StartBatchTransactionAction), // note the returned BatchTransactionId // 2. Generate database partitions for a read or query // (GenerateDbPartitionsForReadAction/GenerateDbPartitionsForQueryAction) // 3. Distribute the partitions over a pool of workers, along with the // transaction ID. // // In each worker: // 4-1. StartBatchTransactionAction with the given transaction ID // 4-2. ExecutePartitionAction for each partition it got, process read results // 4-3. Close (not cleanup) the transaction (CloseBatchTransactionAction). // // When all workers are done: // 5. Cleanup the transaction (CloseBatchTransactionAction). This can be done // either by the last worker to finish the job, or by the main Executor that // initialized this transaction in the first place. It is also possible to clean // it up with a brand new Executor -- just execute StartBatchTransactionAction // with the ID, then clean it up right away. // // Cleaning up is optional, but recommended. message StartBatchTransactionAction { // To start a new transaction, specify an exact timestamp. Alternatively, an // existing batch transaction ID can be used. Either one of two must be // set. oneof param { // The exact timestamp to start the batch transaction. google.protobuf.Timestamp batch_txn_time = 1; // ID of a batch read-only transaction. It can be used to start the same // batch transaction on multiple executors and parallelize partition // processing. bytes tid = 2; } // Database role to assume while performing this action. Setting the // database_role will enforce additional role-based access checks on this // action. string cloud_database_role = 3; } // Closes or cleans up the currently opened batch read-only transaction. // // Once a transaction is closed, the Executor can be disposed of or used to // start start another transaction. Closing a batch transaction in one Executor // doesn't affect the transaction's state in other Executors that also read from // it. // // When a transaction is cleaned up, it becomes globally invalid. Cleaning up is // optional, but recommended. message CloseBatchTransactionAction { // Indicates whether the transaction needs to be cleaned up. bool cleanup = 1; } // Generate database partitions for the given read. Successful outcomes will // contain database partitions in the db_partition field. message GenerateDbPartitionsForReadAction { // Read to generate partitions for. ReadAction read = 1; // Metadata related to the tables involved in the read. repeated TableMetadata table = 2; // Desired size of data in each partition. Spanner doesn't guarantee to // respect this value. optional int64 desired_bytes_per_partition = 3; // If set, the desired max number of partitions. Spanner doesn't guarantee to // respect this value. optional int64 max_partition_count = 4; } // Generate database partitions for the given query. Successful outcomes will // contain database partitions in the db_partition field. message GenerateDbPartitionsForQueryAction { // Query to generate partitions for. QueryAction query = 1; // Desired size of data in each partition. Spanner doesn't guarantee to // respect this value. optional int64 desired_bytes_per_partition = 2; } // Identifies a database partition generated for a particular read or query. To // read rows from the partition, use ExecutePartitionAction. message BatchPartition { // Serialized Partition instance. bytes partition = 1; // The partition token decrypted from partition. bytes partition_token = 2; // Table name is set iff the partition was generated for a read (as opposed to // a query). optional string table = 3; // Index name if the partition was generated for an index read. optional string index = 4; } // Performs a read or query for the given partitions. This action must be // executed in the context of the same transaction that was used to generate // given partitions. message ExecutePartitionAction { // Batch partition to execute on. BatchPartition partition = 1; } // Execute a change stream TVF query. message ExecuteChangeStreamQuery { // Name for this change stream. string name = 1; // Specifies that records with commit_timestamp greater than or equal to // start_time should be returned. google.protobuf.Timestamp start_time = 2; // Specifies that records with commit_timestamp less than or equal to // end_time should be returned. optional google.protobuf.Timestamp end_time = 3; // Specifies which change stream partition to query, based on the content of // child partitions records. optional string partition_token = 4; // Read options for this change stream query. repeated string read_options = 5; // Determines how frequently a heartbeat ChangeRecord will be returned in case // there are no transactions committed in this partition, in milliseconds. optional int32 heartbeat_milliseconds = 6; // Deadline for this change stream query, in seconds. optional int64 deadline_seconds = 7; // Database role to assume while performing this action. This should only be // set for cloud requests. Setting the database role will enforce additional // role-based access checks on this action. optional string cloud_database_role = 8; } // SpannerActionOutcome defines a result of execution of a single SpannerAction. message SpannerActionOutcome { // If an outcome is split into multiple parts, status will be set only in the // last part. optional google.rpc.Status status = 1; // Transaction timestamp. It must be set for successful committed actions. optional google.protobuf.Timestamp commit_time = 2; // Result of a ReadAction. This field must be set for ReadActions even if // no rows were read. optional ReadResult read_result = 3; // Result of a Query. This field must be set for Queries even if no rows were // read. optional QueryResult query_result = 4; // This bit indicates that Spanner has restarted the current transaction. It // means that the client should replay all the reads and writes. // Setting it to true is only valid in the context of a read-write // transaction, as an outcome of a committing FinishTransactionAction. optional bool transaction_restarted = 5; // In successful StartBatchTransactionAction outcomes, this contains the ID of // the transaction. optional bytes batch_txn_id = 6; // Generated database partitions (result of a // GenetageDbPartitionsForReadAction/GenerateDbPartitionsForQueryAction). repeated BatchPartition db_partition = 7; // Result of admin related actions. optional AdminResult admin_result = 8; // Stores rows modified by query in single DML or batch DML action. // In case of batch DML action, stores 0 as row count of errored DML query. repeated int64 dml_rows_modified = 9; // Change stream records returned by a change stream query. repeated ChangeStreamRecord change_stream_records = 10; } // AdminResult contains admin action results, for database/backup/operation. message AdminResult { // Results of cloud backup related actions. CloudBackupResponse backup_response = 1; // Results of operation related actions. OperationResponse operation_response = 2; // Results of database related actions. CloudDatabaseResponse database_response = 3; // Results of instance related actions. CloudInstanceResponse instance_response = 4; // Results of instance config related actions. CloudInstanceConfigResponse instance_config_response = 5; } // CloudBackupResponse contains results returned by cloud backup related // actions. message CloudBackupResponse { // List of backups returned by ListCloudBackupsAction. repeated google.spanner.admin.database.v1.Backup listed_backups = 1; // List of operations returned by ListCloudBackupOperationsAction. repeated google.longrunning.Operation listed_backup_operations = 2; // "next_page_token" can be sent in a subsequent list action // to fetch more of the matching data. string next_page_token = 3; // Backup returned by GetCloudBackupAction/UpdateCloudBackupAction. google.spanner.admin.database.v1.Backup backup = 4; } // OperationResponse contains results returned by operation related actions. message OperationResponse { // List of operations returned by ListOperationsAction. repeated google.longrunning.Operation listed_operations = 1; // "next_page_token" can be sent in a subsequent list action // to fetch more of the matching data. string next_page_token = 2; // Operation returned by GetOperationAction. google.longrunning.Operation operation = 3; } // CloudInstanceResponse contains results returned by cloud instance related // actions. message CloudInstanceResponse { // List of instances returned by ListCloudInstancesAction. repeated google.spanner.admin.instance.v1.Instance listed_instances = 1; // "next_page_token" can be sent in a subsequent list action // to fetch more of the matching data. string next_page_token = 2; // Instance returned by GetCloudInstanceAction google.spanner.admin.instance.v1.Instance instance = 3; } // CloudInstanceConfigResponse contains results returned by cloud instance // config related actions. message CloudInstanceConfigResponse { // List of instance configs returned by ListCloudInstanceConfigsAction. repeated google.spanner.admin.instance.v1.InstanceConfig listed_instance_configs = 1; // "next_page_token" can be sent in a subsequent list action // to fetch more of the matching data. string next_page_token = 2; // Instance config returned by GetCloudInstanceConfigAction. google.spanner.admin.instance.v1.InstanceConfig instance_config = 3; } // CloudDatabaseResponse contains results returned by cloud database related // actions. message CloudDatabaseResponse { // List of databases returned by ListCloudDatabasesAction. repeated google.spanner.admin.database.v1.Database listed_databases = 1; // List of operations returned by ListCloudDatabaseOperationsAction. repeated google.longrunning.Operation listed_database_operations = 2; // "next_page_token" can be sent in a subsequent list action // to fetch more of the matching data. string next_page_token = 3; // Database returned by GetCloudDatabaseAction google.spanner.admin.database.v1.Database database = 4; } // ReadResult contains rows read. message ReadResult { // Table name. string table = 1; // Index name, if read from an index. optional string index = 2; // Request index (multiread only). optional int32 request_index = 3; // Rows read. Each row is a struct with multiple fields, one for each column // in read result. All rows have the same type. repeated ValueList row = 4; // The type of rows read. It must be set if at least one row was read. optional google.spanner.v1.StructType row_type = 5; } // QueryResult contains result of a Query. message QueryResult { // Rows read. Each row is a struct with multiple fields, one for each column // in read result. All rows have the same type. repeated ValueList row = 1; // The type of rows read. It must be set if at least one row was read. optional google.spanner.v1.StructType row_type = 2; } // Raw ChangeStream records. // Encodes one of: DataChangeRecord, HeartbeatRecord, ChildPartitionsRecord // returned from the ChangeStream API. message ChangeStreamRecord { // Record represents one type of the change stream record. oneof record { // Data change record. DataChangeRecord data_change = 1; // Child partitions record. ChildPartitionsRecord child_partition = 2; // Heartbeat record. HeartbeatRecord heartbeat = 3; } } // ChangeStream data change record. message DataChangeRecord { // Column types. message ColumnType { // Column name. string name = 1; // Column type in JSON. string type = 2; // Whether the column is a primary key column. bool is_primary_key = 3; // The position of the column as defined in the schema. int64 ordinal_position = 4; } // Describes the changes that were made. message Mod { // The primary key values in JSON. string keys = 1; // The new values of the changed columns in JSON. Only contain the non-key // columns. string new_values = 2; // The old values of the changed columns in JSON. Only contain the non-key // columns. string old_values = 3; } // The timestamp in which the change was committed. google.protobuf.Timestamp commit_time = 1; // The sequence number for the record within the transaction. string record_sequence = 2; // A globally unique string that represents the transaction in which the // change was committed. string transaction_id = 3; // Indicates whether this is the last record for a transaction in the current // partition. bool is_last_record = 4; // Name of the table affected by the change. string table = 5; // Column types defined in the schema. repeated ColumnType column_types = 6; // Changes made in the transaction. repeated Mod mods = 7; // Describes the type of change. One of INSERT, UPDATE or DELETE. string mod_type = 8; // One of value capture type: NEW_VALUES, OLD_VALUES, OLD_AND_NEW_VALUES. string value_capture_type = 9; // Number of records in transactions. int64 record_count = 10; // Number of partitions in transactions. int64 partition_count = 11; // Transaction tag info. string transaction_tag = 12; // Whether the transaction is a system transactionn. bool is_system_transaction = 13; } // ChangeStream child partition record. message ChildPartitionsRecord { // A single child partition. message ChildPartition { // Partition token string used to identify the child partition in queries. string token = 1; // Parent partition tokens of this child partition. repeated string parent_partition_tokens = 2; } // Data change records returned from child partitions in this child partitions // record will have a commit timestamp greater than or equal to start_time. google.protobuf.Timestamp start_time = 1; // A monotonically increasing sequence number that can be used to define the // ordering of the child partitions record when there are multiple child // partitions records returned with the same start_time in a particular // partition. string record_sequence = 2; // A set of child partitions and their associated information. repeated ChildPartition child_partitions = 3; } // ChangeStream heartbeat record. message HeartbeatRecord { // Timestamp for this heartbeat check. google.protobuf.Timestamp heartbeat_time = 1; } // Options for Cloud Spanner Service. message SpannerOptions { // Options for configuring the session pool SessionPoolOptions session_pool_options = 1; } // Options for the session pool used by the DatabaseClient. message SessionPoolOptions { // passing this as true, will make applicable RPCs use multiplexed sessions // instead of regular sessions bool use_multiplexed = 1; }