Skip to content

fix(pg-cursor): preserve cursor state after late responses - #3785

Merged
brianc merged 1 commit into
brianc:masterfrom
mwolting:matthijs/pg-cursor-late-responses
Sep 18, 2026
Merged

brianc merged 1 commit into
brianc:masterfrom
mwolting:matthijs/pg-cursor-late-responses

Conversation

@mwolting

Copy link
Copy Markdown
Contributor

When a cursor closes before its first backend response arrives, late responses can reset its state and send a second Close/Sync pair. The extra ReadyForQuery can advance the client's query queue too early and corrupt the next query's result.

Preserve closed and failed states when handling late descriptions, and keep closed cursors closed when delivering rows. Fields and the active read callback still get delivered.

Add focused late-message tests and a PostgreSQL regression that closes before responses arrive, checks for a single Sync, and reuses the connection.

When a cursor closes before its first backend response arrives, late responses can reset its state and send a second Close/Sync pair. The extra ReadyForQuery can advance the client's query queue too early and corrupt the next query's result.

Preserve closed and failed states when handling late descriptions, and keep closed cursors closed when delivering rows. Fields and the active read callback still get delivered.

Add focused late-message tests and a PostgreSQL regression that closes before responses arrive, checks for a single Sync, and reuses the connection.

Settlement of reads left in the cursor's queue remains outside this fix.

@brianc brianc left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

holy smokes I can only imagine this was difficult to diagnose the underlying issue in whatever production system you were running - corrupting the state of the client & query queue can result in some extremely confusing errors at runtime. Thanks for this! 100 lines of tests and only a few lines of implementation change is generally a nice type of PR to review! 😎

@brianc
brianc merged commit 17ab6e5 into brianc:master Sep 18, 2026
12 checks passed
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