Skip to content

Commit 6f16669

Browse files
flimzythepudds
authored andcommitted
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 <[email protected]> Reviewed-by: Mark Freeman <[email protected]> Reviewed-by: Junyang Shao <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent 121bc3e commit 6f16669

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

src/database/sql/convert.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (c ccChecker) CheckNamedValue(nv *driver.NamedValue) error {
5555
// it isn't expecting. The final error will be thrown
5656
// in the argument converter loop.
5757
index := nv.Ordinal - 1
58-
if c.want <= index {
58+
if c.want >= 0 && c.want <= index {
5959
return nil
6060
}
6161

src/database/sql/sql_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5135,3 +5135,50 @@ func TestIssue69728(t *testing.T) {
51355135
t.Errorf("not equal; v1 = %v, v2 = %v", v1, v2)
51365136
}
51375137
}
5138+
5139+
func TestColumnConverterWithUnknownInputCount(t *testing.T) {
5140+
db := OpenDB(&unknownInputsConnector{})
5141+
stmt, err := db.Prepare("SELECT ?")
5142+
if err != nil {
5143+
t.Fatal(err)
5144+
}
5145+
_, err = stmt.Exec(1)
5146+
if err != nil {
5147+
t.Fatal(err)
5148+
}
5149+
}
5150+
5151+
type unknownInputsConnector struct{}
5152+
5153+
func (unknownInputsConnector) Connect(context.Context) (driver.Conn, error) {
5154+
return unknownInputsConn{}, nil
5155+
}
5156+
5157+
func (unknownInputsConnector) Driver() driver.Driver { return nil }
5158+
5159+
type unknownInputsConn struct{}
5160+
5161+
func (unknownInputsConn) Prepare(string) (driver.Stmt, error) { return unknownInputsStmt{}, nil }
5162+
func (unknownInputsConn) Close() error { return nil }
5163+
func (unknownInputsConn) Begin() (driver.Tx, error) { return nil, nil }
5164+
5165+
type unknownInputsStmt struct{}
5166+
5167+
func (unknownInputsStmt) Close() error { return nil }
5168+
func (unknownInputsStmt) NumInput() int { return -1 }
5169+
func (unknownInputsStmt) Exec(args []driver.Value) (driver.Result, error) {
5170+
if _, ok := args[0].(string); !ok {
5171+
return nil, fmt.Errorf("Expected string, got %T", args[0])
5172+
}
5173+
return nil, nil
5174+
}
5175+
func (unknownInputsStmt) Query([]driver.Value) (driver.Rows, error) { return nil, nil }
5176+
func (unknownInputsStmt) ColumnConverter(idx int) driver.ValueConverter {
5177+
return unknownInputsValueConverter{}
5178+
}
5179+
5180+
type unknownInputsValueConverter struct{}
5181+
5182+
func (unknownInputsValueConverter) ConvertValue(v any) (driver.Value, error) {
5183+
return "string", nil
5184+
}

0 commit comments

Comments
 (0)