Skip to content

stdlib: implement driver.RowsColumnScanner for Go 1.27#2542

Open
jackc wants to merge 2 commits into
masterfrom
go-67546-stdlib-rows-column-scanner-2
Open

stdlib: implement driver.RowsColumnScanner for Go 1.27#2542
jackc wants to merge 2 commits into
masterfrom
go-67546-stdlib-rows-column-scanner-2

Conversation

@jackc

@jackc jackc commented Apr 25, 2026

Copy link
Copy Markdown
Owner

Go 1.27 adds the driver.RowsColumnScanner interface, which lets a driver scan a column directly into the user's destination. This means stdlib users can now scan PostgreSQL arrays, ranges, multiranges, and other pgtype-aware values directly into Go slices and pgtype types without the *pgtype.Map.SQLScanner adapter.

ScanColumn first tries m.Scan for pgx-native handling, then falls back to the newly public sql.ConvertAssign on a driver.Value produced by the column codec. The fallback preserves database/sql conversion semantics (e.g., scanning a binary bool into *string yields "true"/"false") for destinations pgx does not recognize.

Go 1.27 adds the driver.RowsColumnScanner interface, which lets a driver
scan a column directly into the user's destination. This means stdlib
users can now scan PostgreSQL arrays, ranges, multiranges, and other
pgtype-aware values directly into Go slices and pgtype types without
the *pgtype.Map.SQLScanner adapter.

ScanColumn first tries m.Scan for pgx-native handling, then falls back
to the newly public sql.ConvertAssign on a driver.Value produced by the
column codec. The fallback preserves database/sql conversion semantics
(e.g., scanning a binary bool into *string yields "true"/"false") for
destinations pgx does not recognize.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@jackc
jackc force-pushed the go-67546-stdlib-rows-column-scanner-2 branch from 3b1943c to 764723c Compare June 21, 2026 01:20
The RowsColumnScanner interface signatures changed between the proposal
draft and the released Go 1.27 RC1. Update ScanColumn to take the leading
driver.ScanContext parameter and thread it through to sql.ConvertAssign,
which also gained scanCtx as its first argument. Without these, *Rows did
not satisfy driver.RowsColumnScanner and database/sql silently fell back
to the old Next path.

Add a compile-time assertion so future signature drift fails the build.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jackc

jackc commented Jun 21, 2026

Copy link
Copy Markdown
Owner Author

I've updated this PR for what finally landed in Go 1.27 RC1. Should be ready to go, but extra eyes and testers would be great.

@jackc
jackc marked this pull request as ready for review June 21, 2026 02:34
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.

1 participant