@@ -867,12 +867,20 @@ func (cn *conn) Close() (err error) {
867
867
return cn .sendSimpleMessage ('X' )
868
868
}
869
869
870
+ func toNamedValue (v []driver.Value ) []driver.NamedValue {
871
+ v2 := make ([]driver.NamedValue , len (v ))
872
+ for i := range v {
873
+ v2 [i ] = driver.NamedValue {Value : v [i ]}
874
+ }
875
+ return v2
876
+ }
877
+
870
878
// Implement the "Queryer" interface
871
879
func (cn * conn ) Query (query string , args []driver.Value ) (driver.Rows , error ) {
872
- return cn .query (query , args )
880
+ return cn .query (query , toNamedValue ( args ) )
873
881
}
874
882
875
- func (cn * conn ) query (query string , args []driver.Value ) (_ * rows , err error ) {
883
+ func (cn * conn ) query (query string , args []driver.NamedValue ) (_ * rows , err error ) {
876
884
if err := cn .err .get (); err != nil {
877
885
return nil , err
878
886
}
@@ -921,7 +929,7 @@ func (cn *conn) Exec(query string, args []driver.Value) (res driver.Result, err
921
929
}
922
930
923
931
if cn .binaryParameters {
924
- cn .sendBinaryModeQuery (query , args )
932
+ cn .sendBinaryModeQuery (query , toNamedValue ( args ) )
925
933
926
934
cn .readParseResponse ()
927
935
cn .readBindResponse ()
@@ -1379,10 +1387,10 @@ func (st *stmt) Close() (err error) {
1379
1387
}
1380
1388
1381
1389
func (st * stmt ) Query (v []driver.Value ) (r driver.Rows , err error ) {
1382
- return st .query (v )
1390
+ return st .query (toNamedValue ( v ) )
1383
1391
}
1384
1392
1385
- func (st * stmt ) query (v []driver.Value ) (r * rows , err error ) {
1393
+ func (st * stmt ) query (v []driver.NamedValue ) (r * rows , err error ) {
1386
1394
if err := st .cn .err .get (); err != nil {
1387
1395
return nil , err
1388
1396
}
@@ -1395,18 +1403,11 @@ func (st *stmt) query(v []driver.Value) (r *rows, err error) {
1395
1403
}, nil
1396
1404
}
1397
1405
1398
- func (st * stmt ) Exec (v []driver.Value ) (res driver.Result , err error ) {
1399
- if err := st .cn .err .get (); err != nil {
1400
- return nil , err
1401
- }
1402
- defer st .cn .errRecover (& err )
1403
-
1404
- st .exec (v )
1405
- res , _ , err = st .cn .readExecuteResponse ("simple query" )
1406
- return res , err
1406
+ func (st * stmt ) Exec (v []driver.Value ) (driver.Result , error ) {
1407
+ return st .ExecContext (context .Background (), toNamedValue (v ))
1407
1408
}
1408
1409
1409
- func (st * stmt ) exec (v []driver.Value ) {
1410
+ func (st * stmt ) exec (v []driver.NamedValue ) {
1410
1411
if len (v ) >= 65536 {
1411
1412
errorf ("got %d parameters but PostgreSQL only supports 65535 parameters" , len (v ))
1412
1413
}
@@ -1425,10 +1426,10 @@ func (st *stmt) exec(v []driver.Value) {
1425
1426
w .int16 (0 )
1426
1427
w .int16 (len (v ))
1427
1428
for i , x := range v {
1428
- if x == nil {
1429
+ if x . Value == nil {
1429
1430
w .int32 (- 1 )
1430
1431
} else {
1431
- b := encode (& cn .parameterStatus , x , st .paramTyps [i ])
1432
+ b := encode (& cn .parameterStatus , x . Value , st .paramTyps [i ])
1432
1433
w .int32 (len (b ))
1433
1434
w .bytes (b )
1434
1435
}
@@ -1684,13 +1685,13 @@ func md5s(s string) string {
1684
1685
return fmt .Sprintf ("%x" , h .Sum (nil ))
1685
1686
}
1686
1687
1687
- func (cn * conn ) sendBinaryParameters (b * writeBuf , args []driver.Value ) {
1688
+ func (cn * conn ) sendBinaryParameters (b * writeBuf , args []driver.NamedValue ) {
1688
1689
// Do one pass over the parameters to see if we're going to send any of
1689
1690
// them over in binary. If we are, create a paramFormats array at the
1690
1691
// same time.
1691
1692
var paramFormats []int
1692
1693
for i , x := range args {
1693
- _ , ok := x .([]byte )
1694
+ _ , ok := x .Value . ([]byte )
1694
1695
if ok {
1695
1696
if paramFormats == nil {
1696
1697
paramFormats = make ([]int , len (args ))
@@ -1709,17 +1710,17 @@ func (cn *conn) sendBinaryParameters(b *writeBuf, args []driver.Value) {
1709
1710
1710
1711
b .int16 (len (args ))
1711
1712
for _ , x := range args {
1712
- if x == nil {
1713
+ if x . Value == nil {
1713
1714
b .int32 (- 1 )
1714
1715
} else {
1715
- datum := binaryEncode (& cn .parameterStatus , x )
1716
+ datum := binaryEncode (& cn .parameterStatus , x . Value )
1716
1717
b .int32 (len (datum ))
1717
1718
b .bytes (datum )
1718
1719
}
1719
1720
}
1720
1721
}
1721
1722
1722
- func (cn * conn ) sendBinaryModeQuery (query string , args []driver.Value ) {
1723
+ func (cn * conn ) sendBinaryModeQuery (query string , args []driver.NamedValue ) {
1723
1724
if len (args ) >= 65536 {
1724
1725
errorf ("got %d parameters but PostgreSQL only supports 65535 parameters" , len (args ))
1725
1726
}
0 commit comments