aboutsummaryrefslogtreecommitdiff
path: root/src/database/sql/sql_test.go
diff options
context:
space:
mode:
authorJonathan Hall <flimzy@flimzy.com>2024-07-08 18:14:43 +0200
committert hepudds <thepudds1460@gmail.com>2025-11-21 13:25:48 -0800
commit6f16669e346038c983ae33025ca02dccd78b6f20 (patch)
tree9ac7d7e3f75048e156c9ca45cac24107e2ef1d65 /src/database/sql/sql_test.go
parent121bc3e464b901327a5c138d8a992bb85c440862 (diff)
downloadgo-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.go47
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
+}