@@ -867,12 +867,20 @@ func (cn *conn) Close() (err error) {
867867	return  cn .sendSimpleMessage ('X' )
868868}
869869
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 {Ordinal : i  +  1 , Value : v [i ]}
874+ 	}
875+ 	return  v2 
876+ }
877+ 
870878// Implement the "Queryer" interface 
871879func  (cn  * conn ) Query (query  string , args  []driver.Value ) (driver.Rows , error ) {
872- 	return  cn .query (query , args )
880+ 	return  cn .query (query , toNamedValue ( args ) )
873881}
874882
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 ) {
876884	if  err  :=  cn .err .get (); err  !=  nil  {
877885		return  nil , err 
878886	}
@@ -921,7 +929,7 @@ func (cn *conn) Exec(query string, args []driver.Value) (res driver.Result, err
921929	}
922930
923931	if  cn .binaryParameters  {
924- 		cn .sendBinaryModeQuery (query , args )
932+ 		cn .sendBinaryModeQuery (query , toNamedValue ( args ) )
925933
926934		cn .readParseResponse ()
927935		cn .readBindResponse ()
@@ -1379,10 +1387,10 @@ func (st *stmt) Close() (err error) {
13791387}
13801388
13811389func  (st  * stmt ) Query (v  []driver.Value ) (r  driver.Rows , err  error ) {
1382- 	return  st .query (v )
1390+ 	return  st .query (toNamedValue ( v ) )
13831391}
13841392
1385- func  (st  * stmt ) query (v  []driver.Value ) (r  * rows , err  error ) {
1393+ func  (st  * stmt ) query (v  []driver.NamedValue ) (r  * rows , err  error ) {
13861394	if  err  :=  st .cn .err .get (); err  !=  nil  {
13871395		return  nil , err 
13881396	}
@@ -1395,18 +1403,11 @@ func (st *stmt) query(v []driver.Value) (r *rows, err error) {
13951403	}, nil 
13961404}
13971405
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 ))
14071408}
14081409
1409- func  (st  * stmt ) exec (v  []driver.Value ) {
1410+ func  (st  * stmt ) exec (v  []driver.NamedValue ) {
14101411	if  len (v ) >=  65536  {
14111412		errorf ("got %d parameters but PostgreSQL only supports 65535 parameters" , len (v ))
14121413	}
@@ -1425,10 +1426,10 @@ func (st *stmt) exec(v []driver.Value) {
14251426		w .int16 (0 )
14261427		w .int16 (len (v ))
14271428		for  i , x  :=  range  v  {
1428- 			if  x  ==  nil  {
1429+ 			if  x . Value  ==  nil  {
14291430				w .int32 (- 1 )
14301431			} else  {
1431- 				b  :=  encode (& cn .parameterStatus , x , st .paramTyps [i ])
1432+ 				b  :=  encode (& cn .parameterStatus , x . Value , st .paramTyps [i ])
14321433				w .int32 (len (b ))
14331434				w .bytes (b )
14341435			}
@@ -1684,13 +1685,13 @@ func md5s(s string) string {
16841685	return  fmt .Sprintf ("%x" , h .Sum (nil ))
16851686}
16861687
1687- func  (cn  * conn ) sendBinaryParameters (b  * writeBuf , args  []driver.Value ) {
1688+ func  (cn  * conn ) sendBinaryParameters (b  * writeBuf , args  []driver.NamedValue ) {
16881689	// Do one pass over the parameters to see if we're going to send any of 
16891690	// them over in binary.  If we are, create a paramFormats array at the 
16901691	// same time. 
16911692	var  paramFormats  []int 
16921693	for  i , x  :=  range  args  {
1693- 		_ , ok  :=  x .([]byte )
1694+ 		_ , ok  :=  x .Value . ([]byte )
16941695		if  ok  {
16951696			if  paramFormats  ==  nil  {
16961697				paramFormats  =  make ([]int , len (args ))
@@ -1709,17 +1710,17 @@ func (cn *conn) sendBinaryParameters(b *writeBuf, args []driver.Value) {
17091710
17101711	b .int16 (len (args ))
17111712	for  _ , x  :=  range  args  {
1712- 		if  x  ==  nil  {
1713+ 		if  x . Value  ==  nil  {
17131714			b .int32 (- 1 )
17141715		} else  {
1715- 			datum  :=  binaryEncode (& cn .parameterStatus , x )
1716+ 			datum  :=  binaryEncode (& cn .parameterStatus , x . Value )
17161717			b .int32 (len (datum ))
17171718			b .bytes (datum )
17181719		}
17191720	}
17201721}
17211722
1722- func  (cn  * conn ) sendBinaryModeQuery (query  string , args  []driver.Value ) {
1723+ func  (cn  * conn ) sendBinaryModeQuery (query  string , args  []driver.NamedValue ) {
17231724	if  len (args ) >=  65536  {
17241725		errorf ("got %d parameters but PostgreSQL only supports 65535 parameters" , len (args ))
17251726	}
0 commit comments