diff options
| author | Jonathan Hall <flimzy@flimzy.com> | 2024-07-08 18:14:43 +0200 |
|---|---|---|
| committer | t hepudds <thepudds1460@gmail.com> | 2025-11-21 13:25:48 -0800 |
| commit | 6f16669e346038c983ae33025ca02dccd78b6f20 (patch) | |
| tree | 9ac7d7e3f75048e156c9ca45cac24107e2ef1d65 /src/database/sql/sql_test.go | |
| parent | 121bc3e464b901327a5c138d8a992bb85c440862 (diff) | |
| download | go-6f16669e346038c983ae33025ca02dccd78b6f20.tar.xz | |
database/sql: don't ignore ColumnConverter for unknown input count
In the case a sql driver implements the ColumnConverter interface and also
returns -1 for NumInputs, indicating an unknown number of input arguments to
a query, the previous implementation would ignore the column converter would
not be called, leading to unexpected or invalid arguments passed to the driver.
Fixes #68342
Change-Id: Ib2ddaf040fa9be669d593eacdaa1e88ba66d7bc2
Reviewed-on: https://go-review.googlesource.com/c/go/+/597115
Reviewed-by: Sean Liao <sean@liao.dev>
Reviewed-by: Mark Freeman <markfreeman@google.com>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/database/sql/sql_test.go')
| -rw-r--r-- | src/database/sql/sql_test.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/database/sql/sql_test.go b/src/database/sql/sql_test.go index c3f228ef0b..6ee8505855 100644 --- a/src/database/sql/sql_test.go +++ b/src/database/sql/sql_test.go @@ -5135,3 +5135,50 @@ func TestIssue69728(t *testing.T) { t.Errorf("not equal; v1 = %v, v2 = %v", v1, v2) } } + +func TestColumnConverterWithUnknownInputCount(t *testing.T) { + db := OpenDB(&unknownInputsConnector{}) + stmt, err := db.Prepare("SELECT ?") + if err != nil { + t.Fatal(err) + } + _, err = stmt.Exec(1) + if err != nil { + t.Fatal(err) + } +} + +type unknownInputsConnector struct{} + +func (unknownInputsConnector) Connect(context.Context) (driver.Conn, error) { + return unknownInputsConn{}, nil +} + +func (unknownInputsConnector) Driver() driver.Driver { return nil } + +type unknownInputsConn struct{} + +func (unknownInputsConn) Prepare(string) (driver.Stmt, error) { return unknownInputsStmt{}, nil } +func (unknownInputsConn) Close() error { return nil } +func (unknownInputsConn) Begin() (driver.Tx, error) { return nil, nil } + +type unknownInputsStmt struct{} + +func (unknownInputsStmt) Close() error { return nil } +func (unknownInputsStmt) NumInput() int { return -1 } +func (unknownInputsStmt) Exec(args []driver.Value) (driver.Result, error) { + if _, ok := args[0].(string); !ok { + return nil, fmt.Errorf("Expected string, got %T", args[0]) + } + return nil, nil +} +func (unknownInputsStmt) Query([]driver.Value) (driver.Rows, error) { return nil, nil } +func (unknownInputsStmt) ColumnConverter(idx int) driver.ValueConverter { + return unknownInputsValueConverter{} +} + +type unknownInputsValueConverter struct{} + +func (unknownInputsValueConverter) ConvertValue(v any) (driver.Value, error) { + return "string", nil +} |
