3030import six
3131
3232# pylint: disable=ungrouped-imports
33- from google .cloud .spanner_v1 ._helpers import _make_value_pb
34- from google .cloud .spanner_v1 ._helpers import _metadata_with_prefix
33+ from google .cloud .spanner_v1 ._helpers import (
34+ _make_value_pb ,
35+ _merge_query_options ,
36+ _metadata_with_prefix ,
37+ )
3538from google .cloud .spanner_v1 .batch import Batch
3639from google .cloud .spanner_v1 .gapic .spanner_client import SpannerClient
3740from google .cloud .spanner_v1 .gapic .transports import spanner_grpc_transport
@@ -350,7 +353,9 @@ def drop(self):
350353 metadata = _metadata_with_prefix (self .name )
351354 api .drop_database (self .name , metadata = metadata )
352355
353- def execute_partitioned_dml (self , dml , params = None , param_types = None ):
356+ def execute_partitioned_dml (
357+ self , dml , params = None , param_types = None , query_options = None
358+ ):
354359 """Execute a partitionable DML statement.
355360
356361 :type dml: str
@@ -365,9 +370,20 @@ def execute_partitioned_dml(self, dml, params=None, param_types=None):
365370 (Optional) maps explicit types for one or more param values;
366371 required if parameters are passed.
367372
373+ :type query_options:
374+ :class:`google.cloud.spanner_v1.proto.ExecuteSqlRequest.QueryOptions`
375+ or :class:`dict`
376+ :param query_options:
377+ (Optional) Query optimizer configuration to use for the given query.
378+ If a dict is provided, it must be of the same form as the protobuf
379+ message :class:`~google.cloud.spanner_v1.types.QueryOptions`
380+
368381 :rtype: int
369382 :returns: Count of rows affected by the DML statement.
370383 """
384+ query_options = _merge_query_options (
385+ self ._instance ._client ._query_options , query_options
386+ )
371387 if params is not None :
372388 if param_types is None :
373389 raise ValueError ("Specify 'param_types' when passing 'params'." )
@@ -398,6 +414,7 @@ def execute_partitioned_dml(self, dml, params=None, param_types=None):
398414 transaction = txn_selector ,
399415 params = params_pb ,
400416 param_types = param_types ,
417+ query_options = query_options ,
401418 metadata = metadata ,
402419 )
403420
@@ -748,6 +765,7 @@ def generate_query_batches(
748765 param_types = None ,
749766 partition_size_bytes = None ,
750767 max_partitions = None ,
768+ query_options = None ,
751769 ):
752770 """Start a partitioned query operation.
753771
@@ -783,6 +801,14 @@ def generate_query_batches(
783801 service uses this as a hint, the actual number of partitions may
784802 differ.
785803
804+ :type query_options:
805+ :class:`google.cloud.spanner_v1.proto.ExecuteSqlRequest.QueryOptions`
806+ or :class:`dict`
807+ :param query_options:
808+ (Optional) Query optimizer configuration to use for the given query.
809+ If a dict is provided, it must be of the same form as the protobuf
810+ message :class:`~google.cloud.spanner_v1.types.QueryOptions`
811+
786812 :rtype: iterable of dict
787813 :returns:
788814 mappings of information used peform actual partitioned reads via
@@ -801,6 +827,13 @@ def generate_query_batches(
801827 query_info ["params" ] = params
802828 query_info ["param_types" ] = param_types
803829
830+ # Query-level options have higher precedence than client-level and
831+ # environment-level options
832+ default_query_options = self ._database ._instance ._client ._query_options
833+ query_info ["query_options" ] = _merge_query_options (
834+ default_query_options , query_options
835+ )
836+
804837 for partition in partitions :
805838 yield {"partition" : partition , "query" : query_info }
806839
0 commit comments