Skip to content

Commit 7f53ace

Browse files
exflyarp242
authored andcommitted
fix: pgbouncer
#759
1 parent 5e89899 commit 7f53ace

File tree

1 file changed

+42
-18
lines changed

1 file changed

+42
-18
lines changed

conn.go

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -833,6 +833,7 @@ func decideColumnFormats(colTyps []fieldDesc, forceText bool) (colFmts []format,
833833
}
834834

835835
func (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

18421865
func (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

Comments
 (0)