@@ -3,12 +3,10 @@ package expander
33import (
44 "context"
55 "database/sql"
6- "database/sql/driver"
7- "fmt"
86 "os"
97 "testing"
108
11- "github.com/go-sql-driver/mysql"
9+ _ "github.com/go-sql-driver/mysql"
1210 "github.com/jackc/pgx/v5/pgxpool"
1311 "github.com/ncruces/go-sqlite3"
1412 _ "github.com/ncruces/go-sqlite3/embed"
@@ -45,46 +43,28 @@ func (g *PostgreSQLColumnGetter) GetColumnNames(ctx context.Context, query strin
4543 return columns , nil
4644}
4745
48- // MySQLColumnGetter implements ColumnGetter for MySQL using the forked driver's StmtMetadata.
46+ // MySQLColumnGetter implements ColumnGetter for MySQL. Column names are read
47+ // from the result set metadata returned by executing the query; the test
48+ // tables are empty, so no real rows are transferred.
49+ //
50+ // An earlier implementation pulled column metadata straight out of a prepared
51+ // statement via a forked mysql driver exposing StmtMetadata. That fork
52+ // required a `replace` directive in go.mod, which broke `go install
53+ // github.com/sqlc-dev/sqlc/cmd/sqlc@latest` (see
54+ // https://github.com/sqlc-dev/sqlc/issues/4397). Reading columns from sql.Rows
55+ // works with the upstream driver and keeps the test covering the same
56+ // behavior.
4957type MySQLColumnGetter struct {
5058 db * sql.DB
5159}
5260
5361func (g * MySQLColumnGetter ) GetColumnNames (ctx context.Context , query string ) ([]string , error ) {
54- conn , err := g .db .Conn (ctx )
62+ rows , err := g .db .QueryContext (ctx , query )
5563 if err != nil {
5664 return nil , err
5765 }
58- defer conn .Close ()
59-
60- var columns []string
61- err = conn .Raw (func (driverConn any ) error {
62- preparer , ok := driverConn .(driver.ConnPrepareContext )
63- if ! ok {
64- return fmt .Errorf ("driver connection does not support PrepareContext" )
65- }
66-
67- stmt , err := preparer .PrepareContext (ctx , query )
68- if err != nil {
69- return err
70- }
71- defer stmt .Close ()
72-
73- meta , ok := stmt .(mysql.StmtMetadata )
74- if ! ok {
75- return fmt .Errorf ("prepared statement does not implement StmtMetadata" )
76- }
77-
78- for _ , col := range meta .ColumnMetadata () {
79- columns = append (columns , col .Name )
80- }
81- return nil
82- })
83- if err != nil {
84- return nil , err
85- }
86-
87- return columns , nil
66+ defer rows .Close ()
67+ return rows .Columns ()
8868}
8969
9070// SQLiteColumnGetter implements ColumnGetter for SQLite using the native ncruces/go-sqlite3 API.
0 commit comments