mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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>
This commit is contained in:
parent
121bc3e464
commit
6f16669e34
2 changed files with 48 additions and 1 deletions
|
|
@ -55,7 +55,7 @@ func (c ccChecker) CheckNamedValue(nv *driver.NamedValue) error {
|
|||
// it isn't expecting. The final error will be thrown
|
||||
// in the argument converter loop.
|
||||
index := nv.Ordinal - 1
|
||||
if c.want <= index {
|
||||
if c.want >= 0 && c.want <= index {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue