@@ -600,7 +600,9 @@ func (cn *conn) gname() string {
600
600
func (cn * conn ) simpleExec (q string ) (res driver.Result , commandTag string , err error ) {
601
601
b := cn .writeBuf ('Q' )
602
602
b .string (q )
603
- cn .send (b )
603
+ if err := cn .send (b ); err != nil {
604
+ return res , commandTag , cn .errHandleFatalNetErrors (err )
605
+ }
604
606
605
607
for {
606
608
t , r := cn .recv1 ()
@@ -632,7 +634,10 @@ func (cn *conn) simpleQuery(q string) (res *rows, err error) {
632
634
633
635
b := cn .writeBuf ('Q' )
634
636
b .string (q )
635
- cn .send (b )
637
+
638
+ if err := cn .send (b ); err != nil {
639
+ return nil , cn .errHandleFatalNetErrors (err )
640
+ }
636
641
637
642
for {
638
643
t , r := cn .recv1 ()
@@ -752,7 +757,7 @@ func decideColumnFormats(colTyps []fieldDesc, forceText bool) (colFmts []format,
752
757
}
753
758
}
754
759
755
- func (cn * conn ) prepareTo (q , stmtName string ) * stmt {
760
+ func (cn * conn ) prepareTo (q , stmtName string ) ( * stmt , error ) {
756
761
st := & stmt {cn : cn , name : stmtName }
757
762
758
763
b := cn .writeBuf ('P' )
@@ -765,13 +770,16 @@ func (cn *conn) prepareTo(q, stmtName string) *stmt {
765
770
b .string (st .name )
766
771
767
772
b .next ('S' )
768
- cn .send (b )
773
+ if err := cn .send (b ); err != nil {
774
+ return nil , cn .errHandleFatalNetErrors (err )
775
+ }
769
776
770
777
cn .readParseResponse ()
771
778
st .paramTyps , st .colNames , st .colTyps = cn .readStatementDescribeResponse ()
772
779
st .colFmts , st .colFmtData = decideColumnFormats (st .colTyps , cn .disablePreparedBinaryResult )
773
780
cn .readReadyForQuery ()
774
- return st
781
+
782
+ return st , nil
775
783
}
776
784
777
785
func (cn * conn ) Prepare (q string ) (_ driver.Stmt , err error ) {
@@ -787,7 +795,7 @@ func (cn *conn) Prepare(q string) (_ driver.Stmt, err error) {
787
795
}
788
796
return s , err
789
797
}
790
- return cn .prepareTo (q , cn .gname ()), nil
798
+ return cn .prepareTo (q , cn .gname ())
791
799
}
792
800
793
801
func (cn * conn ) Close () (err error ) {
@@ -829,7 +837,9 @@ func (cn *conn) query(query string, args []driver.Value) (_ *rows, err error) {
829
837
}
830
838
831
839
if cn .binaryParameters {
832
- cn .sendBinaryModeQuery (query , args )
840
+ if err := cn .sendBinaryModeQuery (query , args ); err != nil {
841
+ return nil , cn .errHandleFatalNetErrors (err )
842
+ }
833
843
834
844
cn .readParseResponse ()
835
845
cn .readBindResponse ()
@@ -838,7 +848,11 @@ func (cn *conn) query(query string, args []driver.Value) (_ *rows, err error) {
838
848
cn .postExecuteWorkaround ()
839
849
return rows , nil
840
850
}
841
- st := cn .prepareTo (query , "" )
851
+ st , err := cn .prepareTo (query , "" )
852
+ if err != nil {
853
+ return nil , err
854
+ }
855
+
842
856
st .exec (args )
843
857
return & rows {
844
858
cn : cn ,
@@ -862,7 +876,9 @@ func (cn *conn) Exec(query string, args []driver.Value) (res driver.Result, err
862
876
}
863
877
864
878
if cn .binaryParameters {
865
- cn .sendBinaryModeQuery (query , args )
879
+ if err := cn .sendBinaryModeQuery (query , args ); err != nil {
880
+ return res , cn .errHandleFatalNetErrors (err )
881
+ }
866
882
867
883
cn .readParseResponse ()
868
884
cn .readBindResponse ()
@@ -874,16 +890,25 @@ func (cn *conn) Exec(query string, args []driver.Value) (res driver.Result, err
874
890
// Use the unnamed statement to defer planning until bind
875
891
// time, or else value-based selectivity estimates cannot be
876
892
// used.
877
- st := cn .prepareTo (query , "" )
893
+ st , err := cn .prepareTo (query , "" )
894
+ if err != nil {
895
+ return res , nil
896
+ }
897
+
878
898
r , err := st .Exec (args )
879
899
if err != nil {
880
900
panic (err )
881
901
}
882
902
return r , err
883
903
}
884
904
885
- func (cn * conn ) send (m * writeBuf ) {
905
+ func (cn * conn ) send (m * writeBuf ) error {
886
906
_ , err := cn .c .Write (m .wrap ())
907
+ return err
908
+ }
909
+
910
+ func (cn * conn ) mustSend (m * writeBuf ) {
911
+ err := cn .send (m )
887
912
if err != nil {
888
913
panic (err )
889
914
}
@@ -1109,7 +1134,7 @@ func (cn *conn) auth(r *readBuf, o values) {
1109
1134
case 3 :
1110
1135
w := cn .writeBuf ('p' )
1111
1136
w .string (o ["password" ])
1112
- cn .send (w )
1137
+ cn .mustSend (w )
1113
1138
1114
1139
t , r := cn .recv ()
1115
1140
if t != 'R' {
@@ -1123,7 +1148,7 @@ func (cn *conn) auth(r *readBuf, o values) {
1123
1148
s := string (r .next (4 ))
1124
1149
w := cn .writeBuf ('p' )
1125
1150
w .string ("md5" + md5s (md5s (o ["password" ]+ o ["user" ])+ s ))
1126
- cn .send (w )
1151
+ cn .mustSend (w )
1127
1152
1128
1153
t , r := cn .recv ()
1129
1154
if t != 'R' {
@@ -1145,7 +1170,7 @@ func (cn *conn) auth(r *readBuf, o values) {
1145
1170
w .string ("SCRAM-SHA-256" )
1146
1171
w .int32 (len (scOut ))
1147
1172
w .bytes (scOut )
1148
- cn .send (w )
1173
+ cn .mustSend (w )
1149
1174
1150
1175
t , r := cn .recv ()
1151
1176
if t != 'R' {
@@ -1165,7 +1190,7 @@ func (cn *conn) auth(r *readBuf, o values) {
1165
1190
scOut = sc .Out ()
1166
1191
w = cn .writeBuf ('p' )
1167
1192
w .bytes (scOut )
1168
- cn .send (w )
1193
+ cn .mustSend (w )
1169
1194
1170
1195
t , r = cn .recv ()
1171
1196
if t != 'R' {
@@ -1219,9 +1244,11 @@ func (st *stmt) Close() (err error) {
1219
1244
w := st .cn .writeBuf ('C' )
1220
1245
w .byte ('S' )
1221
1246
w .string (st .name )
1222
- st .cn .send (w )
1247
+ if err := st .cn .send (w ); err != nil {
1248
+ return st .cn .errHandleFatalNetErrors (err )
1249
+ }
1223
1250
1224
- st .cn .send (st .cn .writeBuf ('S' ))
1251
+ st .cn .mustSend (st .cn .writeBuf ('S' ))
1225
1252
1226
1253
t , _ := st .cn .recv1 ()
1227
1254
if t != '3' {
@@ -1299,7 +1326,7 @@ func (st *stmt) exec(v []driver.Value) {
1299
1326
w .int32 (0 )
1300
1327
1301
1328
w .next ('S' )
1302
- cn .send (w )
1329
+ cn .mustSend (w )
1303
1330
1304
1331
cn .readBindResponse ()
1305
1332
cn .postExecuteWorkaround ()
@@ -1577,7 +1604,7 @@ func (cn *conn) sendBinaryParameters(b *writeBuf, args []driver.Value) {
1577
1604
}
1578
1605
}
1579
1606
1580
- func (cn * conn ) sendBinaryModeQuery (query string , args []driver.Value ) {
1607
+ func (cn * conn ) sendBinaryModeQuery (query string , args []driver.Value ) error {
1581
1608
if len (args ) >= 65536 {
1582
1609
errorf ("got %d parameters but PostgreSQL only supports 65535 parameters" , len (args ))
1583
1610
}
@@ -1601,7 +1628,7 @@ func (cn *conn) sendBinaryModeQuery(query string, args []driver.Value) {
1601
1628
b .int32 (0 )
1602
1629
1603
1630
b .next ('S' )
1604
- cn .send (b )
1631
+ return cn .send (b )
1605
1632
}
1606
1633
1607
1634
func (cn * conn ) processParameterStatus (r * readBuf ) {
0 commit comments