Skip to content

feat(dbapi): wire timeout parameter through Connection to execute_sql - #18484

Merged
sakthivelmanii merged 2 commits into
mainfrom
feat/dbapi-timeout
Oct 12, 2026
Merged

sakthivelmanii merged 2 commits into
mainfrom
feat/dbapi-timeout

Conversation

@sakthivelmanii

@sakthivelmanii sakthivelmanii commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor
  • Wire timeout parameter to Connection.init, connect(), run_statement(), and validate().
  • Pass timeout from connection to execute_sql and batch_update calls when specified.
  • Add unit tests for DBAPI timeout propagation.

@sakthivelmanii
sakthivelmanii requested a review from a team as a code owner September 28, 2026 10:57

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces timeout support for Spanner DB-API operations, allowing users to specify a timeout duration for connections and individual SQL statements. It updates the Connection, Cursor, and batch_dml_executor modules to propagate this timeout value and includes comprehensive unit tests. The reviewer suggests refactoring the _do_batch_update_autocommit function to accept the timeout parameter directly instead of the cursor object to improve decoupling and simplify parameter handling.

- Wire timeout parameter to Connection.__init__, connect(), run_statement(), and validate().
- Pass timeout from connection to execute_sql and batch_update calls when specified.
- Add unit tests for DBAPI timeout propagation.
@sakthivelmanii
sakthivelmanii merged commit 98fc304 into main Oct 12, 2026
55 checks passed
@sakthivelmanii
sakthivelmanii deleted the feat/dbapi-timeout branch October 12, 2026 17:12
sakthivelmanii added a commit that referenced this pull request Oct 13, 2026
…API Cursor.timeout (#18485)

Support the `timeout` execution option in the Spanner SQLAlchemy dialect
by wiring it directly to DBAPI `Cursor.timeout`.

### Changes
- **Statement-Level Timeout Isolation**: Pass `timeout` from
`execution_options` to `self.cursor.timeout` in
`SpannerExecutionContext.pre_exec()`. Scoping timeouts to the cursor
avoids mutating shared connection state and prevents statement timeouts
from leaking across queries on the same connection.
- **Connection Default Preservation**: Ensure `reset_connection()` does
not clear connection-level default timeouts when returning connections
to the pool.
- **Unit Tests**: Add tests verifying that `pre_exec` sets
`cursor.timeout` while leaving `connection.timeout` intact.
- **CI Dependency Compatibility**: Pin `sqlalchemy<2.1` and
`alembic<1.20` in `noxfile.py` and guard deprecation imports in
`test_suite_20.py` for CI stability.

### Companion PR
Depends on DBAPI `Cursor.timeout` support in #18484.
parthea pushed a commit that referenced this pull request Nov 12, 2026
🤖 I have created a release *beep* *boop*
---


##
[3.72.0](google-cloud-spanner-v3.71.0...google-cloud-spanner-v3.72.0)
(2026-11-12)


### Features

* **dbapi:** wire timeout parameter through Connection to execute_sql
([#18484](#18484))
([98fc304](98fc304))
* declare Python3.15 support
([8775794](8775794))
* **spanner:** auth login support for Spanner Omni endpoints
([#18273](#18273))
([9e0548d](9e0548d))
* update API sources and regenerate
([#18797](#18797))
([be4d954](be4d954))


### Bug Fixes

* **google-cloud-spanner:** clear buffered DDL statements on rollback
and flush on autocommit
([#18636](#18636))
([15d6a2c](15d6a2c))
* **google-cloud-spanner:** do not replay DDL statements on transaction
retry
([#18625](#18625))
([78b9da2](78b9da2))
* **spanner:** correctly wrap async streaming calls in metrics
interceptor
([#18581](#18581))
([2d19b0a](2d19b0a))
* **spanner:** eliminate duplicate metrics capture and measure full
streaming latency
([#18605](#18605))
([a7678fd](a7678fd))
* **spanner:** record streaming operation completion when stream
finishes
([#18704](#18704))
([ddeae47](ddeae47))
* **spanner:** release transaction lock if inline begin fails
([#18409](#18409))
([dd24029](dd24029))
* **spanner:** stop deleting multiplexed sessions on rotation and close
([#18332](#18332))
([c38e960](c38e960))


### Performance Improvements

* **spanner:** add fast-path for multiplexed session acquisition
([#18317](#18317))
([9569b39](9569b39))
* **spanner:** avoid allocating empty RequestOptions on read and query
paths
([#18422](#18422))
([3743ff0](3743ff0))
* **spanner:** build ExecuteSqlRequest on the raw protobuf message
([#18379](#18379))
([6d91fec](6d91fec))
* **spanner:** eliminate redundant tracing span in run_in_transaction
([#18357](#18357))
([181e26a](181e26a))
* **spanner:** optimize built-in metrics hot path and harden concurrency
([#18329](#18329))
([f2a791f](f2a791f))
* **spanner:** optimize query option merging and prevent in-place
mutation
([#18358](#18358))
([8cb3c6a](8cb3c6a))
* **spanner:** optimize query parameter encoding with direct type
dispatch
([#18359](#18359))
([f06497c](f06497c))
* **spanner:** optimize query result decoding and type resolution
([#18330](#18330))
([ce72986](ce72986))
* **spanner:** optimize request ID header generation and retry closures
([#18408](#18408))
([ad03b95](ad03b95))
* **spanner:** optimize row popping in StreamedResultSet
([#18316](#18316))
([e66103d](e66103d))
* **spanner:** optimize single-chunk results and single-row lookups
([#18602](#18602))
([05b3775](05b3775))
* **spanner:** prune lock and begin event allocations on single-use
snapshots
([#18420](#18420))
([ab56473](ab56473))
* **spanner:** short-circuit trace_call when tracing is inactive
([#18356](#18356))
([58031be](58031be))
* **spanner:** support PartialResultSet.last with background stream
draining
([#18320](#18320))
([80efd63](80efd63))


### Documentation

* fix typos
([#18979](#18979))
([5c8baeb](5c8baeb))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants