Description
Proposal Details
I am the creator of the https://github.com/jackc/pgx/ PostgreSQL driver.
pgx implements a very flexible and convenient type system for its native interface. Most types "just work" without needing to add any pgx or database/sql interfaces. Slices like []int64
can be used directly as query arguments and scan targets. A map[string]string
can be used as a PostgreSQL json
or hstore
value even though the encoding formats are different. This can only work because the encoding and decoding logic has access to connection specific information (e.g. registered Codecs for each type), the PostgreSQL type (OID), the value format (text or binary), and the Go type.
I've been trying with very limited success to expose the this functionality and the relevant types to the database/sql interface. The problem is that an implementer of the sql.Scanner
or driver.Valuer
interfaces does not have any way of accessing the connection information, the PostgreSQL value type, or the value format.
For query arguments, this can be overridden by implementing NamedValueChecker
and simply passing all values through unmodified. So at this point, all of pgx's advanced type handling is available for query arguments.
However, there does not seem to be the same for Scan
. I propose adding a driver.RowsColumnScanner
interface.
type RowsColumnScanner interface {
ScanColumn(i int, dest any) error
}
If this interface is implemented it could completely replace the existing database/sql scan logic. Drivers could implement arbitrary type support and it could significantly improve performance. ErrSkip
could be returned to fallback to the existing database/sql logic.
See #22544 for a related proposal. However, I prefer this proposal as the scanning interface is on the row not the connection or driver. This allows the decoding logic to know what the underlying database type and value format are.
As far as I know this would be an entirely backwards compatible change. The only subtlety I am aware of is a RowsColumnScanner
would have to support ScanColumn
being called multiple times on the same column to preserve support for calling rows.Scan
multiple times on a single row.
Metadata
Metadata
Assignees
Type
Projects
Status