diff --git a/go.mod b/go.mod index cfc8feac975..14fb1e76c03 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( golang.org/x/text v0.3.6 golang.org/x/tools v0.1.2 google.golang.org/api v0.48.0 - google.golang.org/genproto v0.0.0-20210607140030-00d4fb20b1ae + google.golang.org/genproto v0.0.0-20210608175058-d8f7434f6428 google.golang.org/grpc v1.38.0 google.golang.org/protobuf v1.26.0 ) diff --git a/go.sum b/go.sum index 3e6299a7919..9af2daf1109 100644 --- a/go.sum +++ b/go.sum @@ -448,8 +448,8 @@ google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaE google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210607140030-00d4fb20b1ae h1:2dB4bZ/B7RJdKuvHk3mKTzL2xwrikb+Y/QQy7WdyBPk= -google.golang.org/genproto v0.0.0-20210607140030-00d4fb20b1ae/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608175058-d8f7434f6428 h1:ITsjBuiO/w/WrKEnQQNVf771ttSDxvlH3cfVloxqKXA= +google.golang.org/genproto v0.0.0-20210608175058-d8f7434f6428/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/pubsublite/CHANGES.md b/pubsublite/CHANGES.md index bcce2f72704..987d2888988 100644 --- a/pubsublite/CHANGES.md +++ b/pubsublite/CHANGES.md @@ -1,5 +1,21 @@ # Changes +## [0.9.0](https://www.github.com/googleapis/google-cloud-go/compare/pubsublite/v0.8.0...pubsublite/v0.9.0) (2021-06-08) + + +### Features + +* **pubsublite:** Add initial_cursor field to InitialSubscribeRequest ([6f9c8b0](https://www.github.com/googleapis/google-cloud-go/commit/6f9c8b0a5d6e4509f056a146cb586f310f3336a9)) +* **pubsublite:** Add Pub/Sub Lite Reservation APIs ([18375e5](https://www.github.com/googleapis/google-cloud-go/commit/18375e50e8f16e63506129b8927a7b62f85e407b)) +* **pubsublite:** ComputeTimeCursor RPC for Pub/Sub Lite ([d089dda](https://www.github.com/googleapis/google-cloud-go/commit/d089dda0089acb9aaef9b3da40b219476af9fc06)) +* **pubsublite:** detect stream reset signal ([#4144](https://www.github.com/googleapis/google-cloud-go/issues/4144)) ([ff5f8c9](https://www.github.com/googleapis/google-cloud-go/commit/ff5f8c989cba2751dcc77745483ef3828e6df78c)) +* **pubsublite:** flush and reset committer ([#4143](https://www.github.com/googleapis/google-cloud-go/issues/4143)) ([0ecd732](https://www.github.com/googleapis/google-cloud-go/commit/0ecd732e3f57928e7999ae4e78871be070c184d9)) + + +### Bug Fixes + +* **pubsublite:** prevent subscriber flow control token races ([#4060](https://www.github.com/googleapis/google-cloud-go/issues/4060)) ([dc0103b](https://www.github.com/googleapis/google-cloud-go/commit/dc0103baeaf168474b9e163f0aa5f7555170ffc4)) + ## [0.8.0](https://www.github.com/googleapis/google-cloud-go/compare/pubsublite/v0.7.0...pubsublite/v0.8.0) (2021-03-25) diff --git a/pubsublite/go.mod b/pubsublite/go.mod index d4b41b2d4eb..b7e9f94a307 100644 --- a/pubsublite/go.mod +++ b/pubsublite/go.mod @@ -12,7 +12,7 @@ require ( golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 google.golang.org/api v0.48.0 - google.golang.org/genproto v0.0.0-20210607140030-00d4fb20b1ae + google.golang.org/genproto v0.0.0-20210608175058-d8f7434f6428 google.golang.org/grpc v1.38.0 google.golang.org/protobuf v1.26.0 ) diff --git a/pubsublite/go.sum b/pubsublite/go.sum index 12965f6a53f..a0ad5deee39 100644 --- a/pubsublite/go.sum +++ b/pubsublite/go.sum @@ -453,8 +453,8 @@ google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaE google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210607140030-00d4fb20b1ae h1:2dB4bZ/B7RJdKuvHk3mKTzL2xwrikb+Y/QQy7WdyBPk= -google.golang.org/genproto v0.0.0-20210607140030-00d4fb20b1ae/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608175058-d8f7434f6428 h1:ITsjBuiO/w/WrKEnQQNVf771ttSDxvlH3cfVloxqKXA= +google.golang.org/genproto v0.0.0-20210608175058-d8f7434f6428/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/pubsublite/internal/wire/subscriber.go b/pubsublite/internal/wire/subscriber.go index cad68b4d2ae..7dcb4f67f08 100644 --- a/pubsublite/internal/wire/subscriber.go +++ b/pubsublite/internal/wire/subscriber.go @@ -307,16 +307,11 @@ func (s *subscribeStream) unsafeOnMessageResponse(response *pb.MessageResponse) } func (s *subscribeStream) onAck(ac *ackConsumer) { - // Don't block the user's goroutine with potentially expensive ack processing. - go s.onAckAsync(ac.MsgBytes) -} - -func (s *subscribeStream) onAckAsync(msgBytes int64) { s.mu.Lock() defer s.mu.Unlock() if s.status == serviceActive { - s.unsafeAllowFlow(flowControlTokens{Bytes: msgBytes, Messages: 1}) + s.unsafeAllowFlow(flowControlTokens{Bytes: ac.MsgBytes, Messages: 1}) } } diff --git a/pubsublite/internal/wire/subscriber_test.go b/pubsublite/internal/wire/subscriber_test.go index a5b417c8b1d..495e7edcc2a 100644 --- a/pubsublite/internal/wire/subscriber_test.go +++ b/pubsublite/internal/wire/subscriber_test.go @@ -339,8 +339,8 @@ func TestSubscribeStreamFlowControlBatching(t *testing.T) { } sub.Receiver.ValidateMsg(msg1) sub.Receiver.ValidateMsg(msg2) - sub.sub.onAckAsync(msg1.SizeBytes) - sub.sub.onAckAsync(msg2.SizeBytes) + sub.sub.onAck(&ackConsumer{MsgBytes: msg1.SizeBytes}) + sub.sub.onAck(&ackConsumer{MsgBytes: msg2.SizeBytes}) sub.sub.sendBatchFlowControl() if gotErr := sub.FinalError(); !test.ErrorEqual(gotErr, serverErr) { t.Errorf("Final err: (%v), want: (%v)", gotErr, serverErr) @@ -373,8 +373,8 @@ func TestSubscribeStreamExpediteFlowControl(t *testing.T) { } sub.Receiver.ValidateMsg(msg1) sub.Receiver.ValidateMsg(msg2) - sub.sub.onAckAsync(msg1.SizeBytes) - sub.sub.onAckAsync(msg2.SizeBytes) + sub.sub.onAck(&ackConsumer{MsgBytes: msg1.SizeBytes}) + sub.sub.onAck(&ackConsumer{MsgBytes: msg2.SizeBytes}) // Note: the ack for msg2 automatically triggers sending the flow control. if gotErr := sub.FinalError(); !test.ErrorEqual(gotErr, serverErr) { t.Errorf("Final err: (%v), want: (%v)", gotErr, serverErr) @@ -419,7 +419,7 @@ func TestSubscribeStreamDisableBatchFlowControl(t *testing.T) { barrier.ReleaseAfter(func() { // While the stream is not connected, the pending flow control request // should not be released and sent to the stream. - sub.sub.onAckAsync(msg.SizeBytes) + sub.sub.onAck(&ackConsumer{MsgBytes: msg.SizeBytes}) if sub.PendingFlowControlRequest() == nil { t.Errorf("Pending flow control request should not be cleared") } diff --git a/spanner/CHANGES.md b/spanner/CHANGES.md index 00f2174ce76..c54c4915a31 100644 --- a/spanner/CHANGES.md +++ b/spanner/CHANGES.md @@ -1,5 +1,12 @@ # Changes +## [1.20.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.19.0...spanner/v1.20.0) (2021-06-08) + + +### Features + +* **spanner:** add the support of optimizer statistics package ([#2717](https://www.github.com/googleapis/google-cloud-go/issues/2717)) ([29c7247](https://www.github.com/googleapis/google-cloud-go/commit/29c724771f0b19849c76e62d4bc8e9342922bf75)) + ## [1.19.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.18.0...spanner/v1.19.0) (2021-06-03) diff --git a/spanner/batch_test.go b/spanner/batch_test.go index d3396749adb..0c77576b94f 100644 --- a/spanner/batch_test.go +++ b/spanner/batch_test.go @@ -18,7 +18,6 @@ package spanner import ( "context" - "os" "sync" "testing" "time" @@ -80,8 +79,8 @@ func TestPartitionQuery_QueryOptions(t *testing.T) { for _, tt := range queryOptionsTestCases() { t.Run(tt.name, func(t *testing.T) { if tt.env.Options != nil { - os.Setenv("SPANNER_OPTIMIZER_VERSION", tt.env.Options.OptimizerVersion) - defer os.Setenv("SPANNER_OPTIMIZER_VERSION", "") + unset := setQueryOptionsEnvVars(tt.env.Options) + defer unset() } ctx := context.Background() @@ -113,6 +112,9 @@ func TestPartitionQuery_QueryOptions(t *testing.T) { if got, want := p.qreq.QueryOptions.OptimizerVersion, tt.want.Options.OptimizerVersion; got != want { t.Fatalf("Incorrect optimizer version: got %v, want %v", got, want) } + if got, want := p.qreq.QueryOptions.OptimizerStatisticsPackage, tt.want.Options.OptimizerStatisticsPackage; got != want { + t.Fatalf("Incorrect optimizer statistics package: got %v, want %v", got, want) + } } }) } diff --git a/spanner/client.go b/spanner/client.go index 18f136cfa90..9659bb566fc 100644 --- a/spanner/client.go +++ b/spanner/client.go @@ -227,13 +227,17 @@ func allClientOpts(numChannels int, userOpts ...option.ClientOption) []option.Cl // via application-level configuration. If the environment variables are set, // this will return the overwritten query options. func getQueryOptions(opts QueryOptions) QueryOptions { + if opts.Options == nil { + opts.Options = &sppb.ExecuteSqlRequest_QueryOptions{} + } opv := os.Getenv("SPANNER_OPTIMIZER_VERSION") if opv != "" { - if opts.Options == nil { - opts.Options = &sppb.ExecuteSqlRequest_QueryOptions{} - } opts.Options.OptimizerVersion = opv } + opsp := os.Getenv("SPANNER_OPTIMIZER_STATISTICS_PACKAGE") + if opsp != "" { + opts.Options.OptimizerStatisticsPackage = opsp + } return opts } diff --git a/spanner/client_test.go b/spanner/client_test.go index d1e271c7319..2b09d1b5ee2 100644 --- a/spanner/client_test.go +++ b/spanner/client_test.go @@ -397,8 +397,8 @@ func TestClient_Single_QueryOptions(t *testing.T) { for _, tt := range queryOptionsTestCases() { t.Run(tt.name, func(t *testing.T) { if tt.env.Options != nil { - os.Setenv("SPANNER_OPTIMIZER_VERSION", tt.env.Options.OptimizerVersion) - defer os.Setenv("SPANNER_OPTIMIZER_VERSION", "") + unset := setQueryOptionsEnvVars(tt.env.Options) + defer unset() } ctx := context.Background() @@ -458,6 +458,9 @@ func checkReqsForQueryOptions(t *testing.T, server InMemSpannerServer, qo QueryO if got, want := reqQueryOptions.OptimizerVersion, qo.Options.OptimizerVersion; got != want { t.Fatalf("Optimizer version mismatch, got %v, want %v", got, want) } + if got, want := reqQueryOptions.OptimizerStatisticsPackage, qo.Options.OptimizerStatisticsPackage; got != want { + t.Fatalf("Optimizer statistics package mismatch, got %v, want %v", got, want) + } } func testSingleQuery(t *testing.T, serverError error) error { @@ -623,8 +626,8 @@ func TestClient_ReadOnlyTransaction_QueryOptions(t *testing.T) { for _, tt := range queryOptionsTestCases() { t.Run(tt.name, func(t *testing.T) { if tt.env.Options != nil { - os.Setenv("SPANNER_OPTIMIZER_VERSION", tt.env.Options.OptimizerVersion) - defer os.Setenv("SPANNER_OPTIMIZER_VERSION", "") + unset := setQueryOptionsEnvVars(tt.env.Options) + defer unset() } ctx := context.Background() @@ -645,6 +648,15 @@ func TestClient_ReadOnlyTransaction_QueryOptions(t *testing.T) { } } +func setQueryOptionsEnvVars(opts *sppb.ExecuteSqlRequest_QueryOptions) func() { + os.Setenv("SPANNER_OPTIMIZER_VERSION", opts.OptimizerVersion) + os.Setenv("SPANNER_OPTIMIZER_STATISTICS_PACKAGE", opts.OptimizerStatisticsPackage) + return func() { + defer os.Setenv("SPANNER_OPTIMIZER_VERSION", "") + defer os.Setenv("SPANNER_OPTIMIZER_STATISTICS_PACKAGE", "") + } +} + func testReadOnlyTransaction(t *testing.T, executionTimes map[string]SimulatedExecutionTime) error { server, client, teardown := setupMockedTestServer(t) defer teardown() @@ -784,8 +796,8 @@ func TestClient_ReadWriteTransaction_Query_QueryOptions(t *testing.T) { for _, tt := range queryOptionsTestCases() { t.Run(tt.name, func(t *testing.T) { if tt.env.Options != nil { - os.Setenv("SPANNER_OPTIMIZER_VERSION", tt.env.Options.OptimizerVersion) - defer os.Setenv("SPANNER_OPTIMIZER_VERSION", "") + unset := setQueryOptionsEnvVars(tt.env.Options) + defer unset() } ctx := context.Background() @@ -813,8 +825,8 @@ func TestClient_ReadWriteTransaction_Update_QueryOptions(t *testing.T) { for _, tt := range queryOptionsTestCases() { t.Run(tt.name, func(t *testing.T) { if tt.env.Options != nil { - os.Setenv("SPANNER_OPTIMIZER_VERSION", tt.env.Options.OptimizerVersion) - defer os.Setenv("SPANNER_OPTIMIZER_VERSION", "") + unset := setQueryOptionsEnvVars(tt.env.Options) + defer unset() } ctx := context.Background() @@ -2240,7 +2252,10 @@ func TestClient_EmulatorWithCredentialsFile(t *testing.T) { func TestBatchReadOnlyTransaction_QueryOptions(t *testing.T) { ctx := context.Background() - qo := QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1"}} + qo := QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{ + OptimizerVersion: "1", + OptimizerStatisticsPackage: "auto_20191128_14_47_22UTC", + }} _, client, teardown := setupMockedTestServerWithConfig(t, ClientConfig{QueryOptions: qo}) defer teardown() @@ -2256,7 +2271,10 @@ func TestBatchReadOnlyTransaction_QueryOptions(t *testing.T) { } func TestBatchReadOnlyTransactionFromID_QueryOptions(t *testing.T) { - qo := QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1"}} + qo := QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{ + OptimizerVersion: "1", + OptimizerStatisticsPackage: "auto_20191128_14_47_22UTC", + }} _, client, teardown := setupMockedTestServerWithConfig(t, ClientConfig{QueryOptions: qo}) defer teardown() @@ -2276,48 +2294,49 @@ type QueryOptionsTestCase struct { } func queryOptionsTestCases() []QueryOptionsTestCase { + statsPkg := "auto_20191128_14_47_22UTC" return []QueryOptionsTestCase{ { "Client level", - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1"}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1", OptimizerStatisticsPackage: statsPkg}}, QueryOptions{Options: nil}, QueryOptions{Options: nil}, - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1"}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1", OptimizerStatisticsPackage: statsPkg}}, }, { "Environment level", QueryOptions{Options: nil}, - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1"}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1", OptimizerStatisticsPackage: statsPkg}}, QueryOptions{Options: nil}, - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1"}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1", OptimizerStatisticsPackage: statsPkg}}, }, { "Query level", QueryOptions{Options: nil}, QueryOptions{Options: nil}, - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1"}}, - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1"}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1", OptimizerStatisticsPackage: statsPkg}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1", OptimizerStatisticsPackage: statsPkg}}, }, { "Environment level has precedence", - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1"}}, - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "2"}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1", OptimizerStatisticsPackage: statsPkg}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "2", OptimizerStatisticsPackage: statsPkg}}, QueryOptions{Options: nil}, - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "2"}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "2", OptimizerStatisticsPackage: statsPkg}}, }, { "Query level has precedence than client level", - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1"}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1", OptimizerStatisticsPackage: statsPkg}}, QueryOptions{Options: nil}, - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "3"}}, - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "3"}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "3", OptimizerStatisticsPackage: statsPkg}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "3", OptimizerStatisticsPackage: statsPkg}}, }, { "Query level has highest precedence", - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1"}}, - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "2"}}, - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "3"}}, - QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "3"}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1", OptimizerStatisticsPackage: statsPkg}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "2", OptimizerStatisticsPackage: statsPkg}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "3", OptimizerStatisticsPackage: statsPkg}}, + QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "3", OptimizerStatisticsPackage: statsPkg}}, }, } } diff --git a/spanner/go.mod b/spanner/go.mod index c6900c34165..3f8903ae56f 100644 --- a/spanner/go.mod +++ b/spanner/go.mod @@ -10,7 +10,7 @@ require ( go.opencensus.io v0.23.0 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 google.golang.org/api v0.48.0 - google.golang.org/genproto v0.0.0-20210607140030-00d4fb20b1ae + google.golang.org/genproto v0.0.0-20210608175058-d8f7434f6428 google.golang.org/grpc v1.38.0 google.golang.org/protobuf v1.26.0 ) diff --git a/spanner/go.sum b/spanner/go.sum index ec35cd9871e..3afe372822a 100644 --- a/spanner/go.sum +++ b/spanner/go.sum @@ -442,8 +442,8 @@ google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaE google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210607140030-00d4fb20b1ae h1:2dB4bZ/B7RJdKuvHk3mKTzL2xwrikb+Y/QQy7WdyBPk= -google.golang.org/genproto v0.0.0-20210607140030-00d4fb20b1ae/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608175058-d8f7434f6428 h1:ITsjBuiO/w/WrKEnQQNVf771ttSDxvlH3cfVloxqKXA= +google.golang.org/genproto v0.0.0-20210608175058-d8f7434f6428/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/spanner/integration_test.go b/spanner/integration_test.go index 6f415ebb171..511788ed819 100644 --- a/spanner/integration_test.go +++ b/spanner/integration_test.go @@ -635,7 +635,10 @@ func TestIntegration_SingleUse_WithQueryOptions(t *testing.T) { t.Fatal(err) } } - qo := QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1"}} + qo := QueryOptions{Options: &sppb.ExecuteSqlRequest_QueryOptions{ + OptimizerVersion: "1", + OptimizerStatisticsPackage: "auto_20191128_14_47_22UTC", + }} got, err := readAll(client.Single().QueryWithOptions(ctx, Statement{ "SELECT SingerId, FirstName, LastName FROM Singers WHERE SingerId IN (@id1, @id3, @id4)", map[string]interface{}{"id1": int64(1), "id3": int64(3), "id4": int64(4)}, diff --git a/spanner/pdml_test.go b/spanner/pdml_test.go index bbbc2df3187..ca4ac323044 100644 --- a/spanner/pdml_test.go +++ b/spanner/pdml_test.go @@ -145,8 +145,8 @@ func TestPartitionedUpdate_QueryOptions(t *testing.T) { for _, tt := range queryOptionsTestCases() { t.Run(tt.name, func(t *testing.T) { if tt.env.Options != nil { - os.Setenv("SPANNER_OPTIMIZER_VERSION", tt.env.Options.OptimizerVersion) - defer os.Setenv("SPANNER_OPTIMIZER_VERSION", "") + unset := setQueryOptionsEnvVars(tt.env.Options) + defer unset() } ctx := context.Background()