Changes

v1.3.0

  • Query options:
    • Adds the support of providing query options (optimizer version) via three ways (precedence follows the order): client-level < environment variables < query-level. The environment variable is set by “SPANNER_OPTIMIZER_VERSION”.
  • Connection pooling:
    • Use the new connection pooling in gRPC. This change deprecates ClientConfig.numChannels and users should move to WithGRPCConnectionPool(numChannels) at their earliest convenience. Example:
      // numChannels (deprecated):
      err, client := NewClientWithConfig(ctx, database, ClientConfig{NumChannels: 8})
      
      // gRPC connection pool:
      err, client := NewClientWithConfig(ctx, database, ClientConfig{}, option.WithGRPCConnectionPool(8))
      
  • Error handling:
    • Do not rollback after failed commit.
    • Return TransactionOutcomeUnknownError if a DEADLINE_EXCEEDED or CANCELED error occurs while a COMMIT request is in flight.
  • spansql:
    • Added support for IN expressions and OFFSET clauses.
    • Fixed parsing of table constraints.
    • Added support for foreign key constraints in ALTER TABLE and CREATE TABLE.
    • Added support for GROUP BY clauses.
  • spannertest:
    • Added support for IN expressions and OFFSET clauses.
    • Added support for GROUP BY clauses.
    • Fixed data race in query execution.
    • No longer rejects reads specifying an index to use.
    • Return last commit timestamp as read timestamp when requested.
    • Evaluate add, subtract, multiply, divide, unary negation, unary not, bitwise and/xor/or operations, as well as reporting column types for expressions involving any possible arithmetic operator.arithmetic expressions.
    • Fixed handling of descending primary keys.
  • Misc:
    • Change default healthcheck interval to 30 mins to reduce the GetSession calls made to the backend.
    • Add marshal/unmarshal json for nullable types to support NullString, NullInt64, NullFloat64, NullBool, NullTime, NullDate.
    • Use ResourceInfo to extract error.
    • Extract retry info from status.

v1.2.1

  • Fix session leakage for ApplyAtLeastOnce. Previously session handles where leaked whenever Commit() returned a non-abort, non-session-not-found error, due to a missing recycle() call.
  • Fix error for WriteStruct with pointers. This fixes a specific check for encoding and decoding to pointer types.
  • Fix a GRPCStatus issue that returns a Status that has Unknown code if the base error is nil. Now, it always returns a Status based on Code field of current error.

v1.2.0

  • Support tracking stacktrace of sessionPool.take() that allows the user to instruct the session pool to keep track of the stacktrace of each goroutine that checks out a session from the pool. This is disabled by default, but it can be enabled by setting SessionPoolConfig.TrackSessionHandles: true.
  • Add resource-based routing that includes a step to retrieve the instance-specific endpoint before creating the session client when creating a new spanner client. This is disabled by default, but it can be enabled by setting GOOGLE_CLOUD_SPANNER_ENABLE_RESOURCE_BASED_ROUTING.
  • Make logger configurable so that the Spanner client can now be configured to use a specific logger instead of the standard logger.
  • Support encoding custom types that point back to supported basic types.
  • Allow decoding Spanner values to custom types that point back to supported types.

v1.1.0

  • The String() method of NullString, NullTime and NullDate will now return an unquoted string instead of a quoted string. This is a BREAKING CHANGE. If you relied on the old behavior, please use fmt.Sprintf(“%q”, T).
  • The Spanner client will now use the new BatchCreateSessions RPC to initialize the session pool. This will improve the startup time of clients that are initialized with a minimum number of sessions greater than zero (i.e. SessionPoolConfig.MinOpened>0).
  • Spanner clients that are created with the NewClient method will now default to a minimum of 100 opened sessions in the pool (i.e. SessionPoolConfig.MinOpened=100). This will improve the performance of the first transaction/query that is executed by an application, as a session will normally not have to be created as part of the transaction. Spanner clients that are created with the NewClientWithConfig method are not affected by this change.
  • Spanner clients that are created with the NewClient method will now default to a write sessions fraction of 0.2 in the pool (i.e. SessionPoolConfig.WriteSessions=0.2). Spanner clients that are created with the NewClientWithConfig method are not affected by this change.
  • The session pool maintenance worker has been improved so it keeps better track of the actual number of sessions needed. It will now less often delete and re-create sessions. This can improve the overall performance of applications with a low transaction rate.

v1.0.0

This is the first tag to carve out spanner as its own module. See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository.