Skip to content

Commit 21a1c4a

Browse files
committed
Merge branch 'main' into spanner-lib
2 parents 4d7aad9 + d30d6d1 commit 21a1c4a

25 files changed

+2991
-469
lines changed

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "1.13.2"
2+
".": "1.14.0"
33
}

CHANGES.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,27 @@
11
# Changelog
22

3+
## [1.14.0](https://github.com/googleapis/go-sql-spanner/compare/v1.13.2...v1.14.0) (2025-06-05)
4+
5+
6+
### Features
7+
8+
* Support PostgreSQL-dialect databases ([#443](https://github.com/googleapis/go-sql-spanner/issues/443)) ([30df107](https://github.com/googleapis/go-sql-spanner/commit/30df1074644ef881d1c7993376167eb7162e53da))
9+
* Support UUID data type ([#440](https://github.com/googleapis/go-sql-spanner/issues/440)) ([c68065d](https://github.com/googleapis/go-sql-spanner/commit/c68065d5eb44e80ef93d02bddad759e0cc1993ac))
10+
11+
12+
### Bug Fixes
13+
14+
* Return explicit error message when using DDL statements with QueryContext ([#438](https://github.com/googleapis/go-sql-spanner/issues/438)) ([a214d86](https://github.com/googleapis/go-sql-spanner/commit/a214d86e1096eaac828434d02c1de1f93d8095c8))
15+
* Update all dependencies ([#419](https://github.com/googleapis/go-sql-spanner/issues/419)) ([70fcee5](https://github.com/googleapis/go-sql-spanner/commit/70fcee5a50361760aa9634f4ac77499f1bf5036f))
16+
* Update all dependencies ([#430](https://github.com/googleapis/go-sql-spanner/issues/430)) ([420902e](https://github.com/googleapis/go-sql-spanner/commit/420902e9136dbad3bbc7ac7b860e785f40944d28))
17+
* Update module cloud.google.com/go/spanner to v1.82.0 ([#423](https://github.com/googleapis/go-sql-spanner/issues/423)) ([57881f7](https://github.com/googleapis/go-sql-spanner/commit/57881f779d6f88f8c549ac3f17cdd4af9edf1a7b))
18+
* Update module github.com/hashicorp/golang-lru to v2 ([#444](https://github.com/googleapis/go-sql-spanner/issues/444)) ([98e3097](https://github.com/googleapis/go-sql-spanner/commit/98e30977f2287b80ba4d3cb35e13089f738e7e57))
19+
20+
21+
### Performance Improvements
22+
23+
* Use statement cache to avoid repeated SQL string parsing ([#445](https://github.com/googleapis/go-sql-spanner/issues/445)) ([f2fbcab](https://github.com/googleapis/go-sql-spanner/commit/f2fbcabff7b94eea7e56ebf401cebe1907de0f48))
24+
325
## [1.13.2](https://github.com/googleapis/go-sql-spanner/compare/v1.13.1...v1.13.2) (2025-05-14)
426

527

README.md

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
[Google Cloud Spanner](https://cloud.google.com/spanner) driver for
66
Go's [database/sql](https://golang.org/pkg/database/sql/) package.
77

8+
This driver can be used with both Spanner GoogleSQL and Spanner PostgreSQL databases.
9+
810
```go
911
import _ "github.com/googleapis/go-sql-spanner"
1012

@@ -13,8 +15,8 @@ if err != nil {
1315
log.Fatal(err)
1416
}
1517

16-
// Print tweets with more than 500 likes.
17-
rows, err := db.QueryContext(ctx, "SELECT id, text FROM tweets WHERE likes > @likes", sql.Named("likes", 500))
18+
// Print singers with more than 500 likes.
19+
rows, err := db.QueryContext(ctx, "SELECT id, name FROM singers WHERE likes > ?", 500)
1820
if err != nil {
1921
log.Fatal(err)
2022
}
@@ -55,6 +57,17 @@ db.ExecContext(ctx, "INSERT INTO tweets (id, text, rts) VALUES (@id, @text, @rts
5557
sql.Named("id", id), sql.Named("text", text), sql.Named("rts", 10000))
5658
```
5759

60+
### Using PostgreSQL-style positional arguments
61+
62+
When connected to a PostgreSQL-dialect Spanner database, you can also use PostgreSQL-style
63+
query parameters `$1, $2, ..., $n`. These query parameters are handled as positional parameters.
64+
65+
```go
66+
db.QueryContext(ctx, "SELECT id, text FROM tweets WHERE likes > $1", 500)
67+
68+
db.ExecContext(ctx, "INSERT INTO tweets (id, text, rts) VALUES ($1, $2, $3)", id, text, 10000)
69+
```
70+
5871
### Using named parameters with positional arguments (not recommended)
5972
Named parameters can also be used in combination with positional arguments,
6073
but this is __not recommended__, as the behavior can be hard to predict if
@@ -215,10 +228,19 @@ $ export SPANNER_EMULATOR_HOST=localhost:9010
215228

216229
## Spanner PostgreSQL Interface
217230

218-
This driver only works with the Spanner GoogleSQL dialect. For the
219-
Spanner PostgreSQL dialect, any PostgreSQL driver that implements the
220-
[database/sql](https://golang.org/pkg/database/sql/) interface can be used
221-
in combination with
231+
This driver works with both Spanner GoogleSQL and PostgreSQL dialects.
232+
The driver automatically detects the dialect of the database that it is connected to.
233+
234+
Note that the types of query parameters that are supported depends on the dialect of the
235+
database that the driver is connected to:
236+
1. Positional parameters (`?`): Supported for both dialects.
237+
2. Named parameters (`@id`, `@name`, ...): Supported for both dialects.
238+
3. PostgreSQL-style positional parameters (`$1`, `$2`, ...): Only supported for PostgreSQL databases.
239+
240+
### Alternatives
241+
242+
You can also use Spanner PostgreSQL dialect databases with any off-the-shelf PostgreSQL driver that
243+
implements the [database/sql](https://golang.org/pkg/database/sql/) interface in combination with
222244
[PGAdapter](https://cloud.google.com/spanner/docs/pgadapter).
223245

224246
For example, the [pgx](https://github.com/jackc/pgx) driver can be used in combination with

benchmarks/go.mod

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@ toolchain go1.24.3
77
replace github.com/googleapis/go-sql-spanner => ../
88

99
require (
10-
cloud.google.com/go v0.121.1
10+
cloud.google.com/go v0.121.2
1111
cloud.google.com/go/spanner v1.82.0
1212
github.com/google/uuid v1.6.0
1313
github.com/googleapis/go-sql-spanner v1.13.2
14-
google.golang.org/api v0.233.0
15-
google.golang.org/grpc v1.72.1
14+
google.golang.org/api v0.236.0
15+
google.golang.org/grpc v1.73.0
1616
google.golang.org/protobuf v1.36.6
1717
)
1818

1919
require (
2020
cel.dev/expr v0.23.1 // indirect
2121
cloud.google.com/go/auth v0.16.1 // indirect
2222
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
23-
cloud.google.com/go/compute/metadata v0.6.0 // indirect
23+
cloud.google.com/go/compute/metadata v0.7.0 // indirect
2424
cloud.google.com/go/iam v1.5.2 // indirect
2525
cloud.google.com/go/longrunning v0.6.7 // indirect
2626
cloud.google.com/go/monitoring v1.24.2 // indirect
@@ -38,6 +38,7 @@ require (
3838
github.com/google/s2a-go v0.1.9 // indirect
3939
github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
4040
github.com/googleapis/gax-go/v2 v2.14.2 // indirect
41+
github.com/hashicorp/golang-lru v0.6.0 // indirect
4142
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
4243
github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect
4344
github.com/zeebo/errs v1.4.0 // indirect
@@ -60,5 +61,5 @@ require (
6061
golang.org/x/time v0.11.0 // indirect
6162
google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 // indirect
6263
google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 // indirect
63-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect
64+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
6465
)

benchmarks/go.sum

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY
3838
cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
3939
cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=
4040
cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY=
41-
cloud.google.com/go v0.121.1 h1:S3kTQSydxmu1JfLRLpKtxRPA7rSrYPRPEUmL/PavVUw=
42-
cloud.google.com/go v0.121.1/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw=
41+
cloud.google.com/go v0.121.2 h1:v2qQpN6Dx9x2NmwrqlesOt3Ys4ol5/lFZ6Mg1B7OJCg=
42+
cloud.google.com/go v0.121.2/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw=
4343
cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=
4444
cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=
4545
cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E=
@@ -184,8 +184,8 @@ cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZ
184184
cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
185185
cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
186186
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
187-
cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
188-
cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
187+
cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU=
188+
cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo=
189189
cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY=
190190
cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck=
191191
cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w=
@@ -829,6 +829,8 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4Zs
829829
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=
830830
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
831831
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
832+
github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4=
833+
github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
832834
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
833835
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
834836
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
@@ -1363,8 +1365,8 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/
13631365
google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI=
13641366
google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0=
13651367
google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
1366-
google.golang.org/api v0.233.0 h1:iGZfjXAJiUFSSaekVB7LzXl6tRfEKhUN7FkZN++07tI=
1367-
google.golang.org/api v0.233.0/go.mod h1:TCIVLLlcwunlMpZIhIp7Ltk77W+vUSdUKAAIlbxY44c=
1368+
google.golang.org/api v0.236.0 h1:CAiEiDVtO4D/Qja2IA9VzlFrgPnK3XVMmRoJZlSWbc0=
1369+
google.golang.org/api v0.236.0/go.mod h1:X1WF9CU2oTc+Jml1tiIxGmWFK/UZezdqEu09gcxZAj4=
13681370
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
13691371
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
13701372
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -1508,8 +1510,8 @@ google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 h1:1tXaIXCracvtsRx
15081510
google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:49MsLSx0oWMOZqcpB3uL8ZOkAh1+TndpJ8ONoCBWiZk=
15091511
google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 h1:vPV0tzlsK6EzEDHNNH5sa7Hs9bd7iXR7B1tSiPepkV0=
15101512
google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw=
1511-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34=
1512-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
1513+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
1514+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
15131515
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
15141516
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
15151517
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -1551,8 +1553,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v
15511553
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
15521554
google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
15531555
google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
1554-
google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA=
1555-
google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
1556+
google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
1557+
google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
15561558
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
15571559
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
15581560
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=

conn.go

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ type SpannerConn interface {
205205
var _ SpannerConn = &conn{}
206206

207207
type conn struct {
208+
parser *statementParser
208209
connector *connector
209210
closed bool
210211
client *spanner.Client
@@ -725,7 +726,7 @@ func (c *conn) Prepare(query string) (driver.Stmt, error) {
725726

726727
func (c *conn) PrepareContext(_ context.Context, query string) (driver.Stmt, error) {
727728
execOptions := c.options()
728-
parsedSQL, args, err := parseParameters(query)
729+
parsedSQL, args, err := c.parser.parseParameters(query)
729730
if err != nil {
730731
return nil, err
731732
}
@@ -734,7 +735,7 @@ func (c *conn) PrepareContext(_ context.Context, query string) (driver.Stmt, err
734735

735736
func (c *conn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) {
736737
// Execute client side statement if it is one.
737-
clientStmt, err := parseClientSideStatement(c, query)
738+
clientStmt, err := c.parser.parseClientSideStatement(c, query)
738739
if err != nil {
739740
return nil, err
740741
}
@@ -755,11 +756,11 @@ func (c *conn) queryContext(ctx context.Context, query string, execOptions ExecO
755756
return pq.execute(ctx, execOptions.PartitionedQueryOptions.ExecutePartition.Index)
756757
}
757758

758-
stmt, err := prepareSpannerStmt(query, args)
759+
stmt, err := prepareSpannerStmt(c.parser, query, args)
759760
if err != nil {
760761
return nil, err
761762
}
762-
statementType := detectStatementType(query)
763+
statementType := c.parser.detectStatementType(query)
763764
// DDL statements are not supported in QueryContext so fail early.
764765
if statementType.statementType == statementTypeDdl {
765766
return nil, spanner.ToSpannerError(status.Errorf(codes.FailedPrecondition, "QueryContext does not support DDL statements, use ExecContext instead"))
@@ -794,17 +795,19 @@ func (c *conn) queryContext(ctx context.Context, query string, execOptions ExecO
794795
}
795796
}
796797
res := &rows{it: iter, decodeOption: execOptions.DecodeOption, decodeToNativeArrays: execOptions.DecodeToNativeArrays}
797-
res.getColumns()
798-
if res.dirtyErr != nil && !errors.Is(res.dirtyErr, iterator.Done) {
799-
_ = res.Close()
800-
return nil, res.dirtyErr
798+
if execOptions.DecodeOption == DecodeOptionProto {
799+
res.getColumns()
800+
if res.dirtyErr != nil && !errors.Is(res.dirtyErr, iterator.Done) {
801+
_ = res.Close()
802+
return nil, res.dirtyErr
803+
}
801804
}
802805
return res, nil
803806
}
804807

805808
func (c *conn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) {
806809
// Execute client side statement if it is one.
807-
stmt, err := parseClientSideStatement(c, query)
810+
stmt, err := c.parser.parseClientSideStatement(c, query)
808811
if err != nil {
809812
return nil, err
810813
}
@@ -819,7 +822,7 @@ func (c *conn) execContext(ctx context.Context, query string, execOptions ExecOp
819822
// Clear the commit timestamp of this connection before we execute the statement.
820823
c.commitTs = nil
821824

822-
statementInfo := detectStatementType(query)
825+
statementInfo := c.parser.detectStatementType(query)
823826
// Use admin API if DDL statement is provided.
824827
if statementInfo.statementType == statementTypeDdl {
825828
// Spanner does not support DDL in transactions, and although it is technically possible to execute DDL
@@ -831,7 +834,7 @@ func (c *conn) execContext(ctx context.Context, query string, execOptions ExecOp
831834
return c.execDDL(ctx, spanner.NewStatement(query))
832835
}
833836

834-
ss, err := prepareSpannerStmt(query, args)
837+
ss, err := prepareSpannerStmt(c.parser, query, args)
835838
if err != nil {
836839
return nil, err
837840
}

0 commit comments

Comments
 (0)