@@ -833,6 +833,7 @@ func decideColumnFormats(colTyps []fieldDesc, forceText bool) (colFmts []format,
833833}
834834
835835func (cn * conn ) prepareTo (q , stmtName string ) * stmt {
836+ var err error
836837 st := & stmt {cn : cn , name : stmtName }
837838
838839 b := cn .writeBuf ('P' )
@@ -844,13 +845,29 @@ func (cn *conn) prepareTo(q, stmtName string) *stmt {
844845 b .byte ('S' )
845846 b .string (st .name )
846847
847- b .next ('S' )
848+ if stmtName != "" {
849+ b .next ('S' ) // sync
850+ } else {
851+ b .next ('H' ) // flush
852+ }
848853 cn .send (b )
849854
850- cn .readParseResponse ()
851- st .paramTyps , st .colNames , st .colTyps = cn .readStatementDescribeResponse ()
855+ if err := cn .readParseResponse (); err != nil {
856+ cn .send (cn .writeBuf ('S' )) // sync
857+ cn .readReadyForQuery ()
858+ panic (err )
859+ }
860+
861+ st .paramTyps , st .colNames , st .colTyps , err = cn .readStatementDescribeResponse ()
862+ if err != nil {
863+ cn .send (cn .writeBuf ('S' )) // sync
864+ cn .readReadyForQuery ()
865+ panic (err )
866+ }
852867 st .colFmts , st .colFmtData = decideColumnFormats (st .colTyps , cn .disablePreparedBinaryResult )
853- cn .readReadyForQuery ()
868+ if stmtName != "" {
869+ cn .readReadyForQuery ()
870+ }
854871 return st
855872}
856873
@@ -911,7 +928,11 @@ func (cn *conn) query(query string, args []driver.Value) (_ *rows, err error) {
911928 if cn .binaryParameters {
912929 cn .sendBinaryModeQuery (query , args )
913930
914- cn .readParseResponse ()
931+ if err := cn .readParseResponse (); err != nil {
932+ cn .readReadyForQuery ()
933+ panic (err )
934+ }
935+
915936 cn .readBindResponse ()
916937 rows := & rows {cn : cn }
917938 rows .rowsHeader = cn .readPortalDescribeResponse ()
@@ -944,7 +965,10 @@ func (cn *conn) Exec(query string, args []driver.Value) (res driver.Result, err
944965 if cn .binaryParameters {
945966 cn .sendBinaryModeQuery (query , args )
946967
947- cn .readParseResponse ()
968+ if err := cn .readParseResponse (); err != nil {
969+ cn .readReadyForQuery ()
970+ panic (err )
971+ }
948972 cn .readBindResponse ()
949973 cn .readPortalDescribeResponse ()
950974 cn .postExecuteWorkaround ()
@@ -1824,25 +1848,25 @@ func (cn *conn) processBackendKeyData(r *readBuf) {
18241848 cn .secretKey = r .int32 ()
18251849}
18261850
1827- func (cn * conn ) readParseResponse () {
1851+ func (cn * conn ) readParseResponse () ( err error ) {
18281852 t , r := cn .recv1 ()
18291853 switch t {
18301854 case '1' :
1831- return
18321855 case 'E' :
1833- err := parseError (r )
1834- cn .readReadyForQuery ()
1835- panic (err )
1856+ err = parseError (r )
18361857 default :
18371858 cn .err .set (driver .ErrBadConn )
1838- errorf ("unexpected Parse response %q" , t )
1859+ err = fmterrorf ("unexpected Parse response %q" , t )
18391860 }
1861+
1862+ return
18401863}
18411864
18421865func (cn * conn ) readStatementDescribeResponse () (
18431866 paramTyps []oid.Oid ,
18441867 colNames []string ,
18451868 colTyps []fieldDesc ,
1869+ err error ,
18461870) {
18471871 for {
18481872 t , r := cn .recv1 ()
@@ -1854,17 +1878,17 @@ func (cn *conn) readStatementDescribeResponse() (
18541878 paramTyps [i ] = r .oid ()
18551879 }
18561880 case 'n' :
1857- return paramTyps , nil , nil
1881+ return
18581882 case 'T' :
18591883 colNames , colTyps = parseStatementRowDescribe (r )
1860- return paramTyps , colNames , colTyps
1884+ return
18611885 case 'E' :
1862- err := parseError (r )
1863- cn .readReadyForQuery ()
1864- panic (err )
1886+ err = parseError (r )
1887+ return
18651888 default :
18661889 cn .err .set (driver .ErrBadConn )
1867- errorf ("unexpected Describe statement response %q" , t )
1890+ err = fmterrorf ("unexpected Describe statement response %q" , t )
1891+ return
18681892 }
18691893 }
18701894}
0 commit comments