Skip to content

Commit 8649474

Browse files
authored
Merge pull request #721 from btoonk/btoonk/proxy-null
fix: return null values properly in proxy mode
2 parents 1c6c7a2 + e30dedf commit 8649474

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

server/resp.go

+9-4
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,16 @@ func (c *Conn) writeFieldList(fs []*Field, data []byte) error {
182182
func (c *Conn) writeFieldValues(fv []FieldValue) error {
183183
data := make([]byte, 4, 1024)
184184
for _, v := range fv {
185-
tv, err := FormatTextValue(v.Value())
186-
if err != nil {
187-
return err
185+
if v.Value() == nil {
186+
// NULL value is encoded as 0xfb here
187+
data = append(data, []byte{0xfb}...)
188+
} else {
189+
tv, err := FormatTextValue(v.Value())
190+
if err != nil {
191+
return err
192+
}
193+
data = append(data, PutLengthEncodedString(tv)...)
188194
}
189-
data = append(data, PutLengthEncodedString(tv)...)
190195
}
191196

192197
return c.WritePacket(data)

server/resp_test.go

+40
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,43 @@ func (t *respConnTestSuite) TestConnWriteFieldList(c *check.C) {
189189
c.Assert(clientConn.WriteBuffered[:27], check.BytesEquals, []byte{23, 0, 0, 0, 3, 100, 101, 102, 0, 0, 0, 1, 'c', 0, 12, 33, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0})
190190
c.Assert(clientConn.WriteBuffered[27:], check.BytesEquals, []byte{1, 0, 0, 1, mysql.EOF_HEADER})
191191
}
192+
193+
func (t *respConnTestSuite) TestConnWriteFieldValues(c *check.C) {
194+
clientConn := &mockconn.MockConn{MultiWrite: true}
195+
conn := &Conn{Conn: packet.NewConn(clientConn)}
196+
197+
r, err := mysql.BuildSimpleTextResultset([]string{"c"}, [][]interface{}{
198+
[]interface{}{"d"},
199+
[]interface{}{nil},
200+
})
201+
202+
c.Assert(err, check.IsNil)
203+
err = conn.writeFieldList(r.Fields, nil)
204+
c.Assert(err, check.IsNil)
205+
206+
// fields and EOF
207+
c.Assert(clientConn.WriteBuffered[:27], check.BytesEquals, []byte{23, 0, 0, 0, 3, 100, 101, 102, 0, 0, 0, 1, 'c', 0, 12, 33, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0})
208+
c.Assert(clientConn.WriteBuffered[27:32], check.BytesEquals, []byte{1, 0, 0, 1, mysql.EOF_HEADER})
209+
210+
r.Values = make([][]mysql.FieldValue, len(r.RowDatas))
211+
for i := range r.Values {
212+
r.Values[i], err = r.RowDatas[i].Parse(r.Fields, false, r.Values[i])
213+
214+
c.Assert(err, check.IsNil)
215+
216+
err = conn.writeFieldValues(r.Values[i])
217+
c.Assert(err, check.IsNil)
218+
}
219+
220+
err = conn.writeEOF()
221+
c.Assert(err, check.IsNil)
222+
223+
// first row
224+
c.Assert(clientConn.WriteBuffered[32:38], check.BytesEquals, []byte{2, 0, 0, 2, 1, 'd'})
225+
226+
// second row with NULL value
227+
c.Assert(clientConn.WriteBuffered[38:43], check.BytesEquals, []byte{1, 0, 0, 3, 251})
228+
229+
// EOF
230+
c.Assert(clientConn.WriteBuffered[43:], check.BytesEquals, []byte{1, 0, 0, 4, mysql.EOF_HEADER})
231+
}

0 commit comments

Comments
 (0)