@@ -8,25 +8,25 @@ import (
88 "runtime"
99
1010 "github.com/go-mysql-org/go-mysql/mysql"
11+ "github.com/go-mysql-org/go-mysql/stmt"
1112 "github.com/go-mysql-org/go-mysql/utils"
1213 "github.com/pingcap/errors"
1314)
1415
1516type Stmt struct {
16- conn * Conn
17- id uint32
18-
19- params int
20- columns int
17+ conn * Conn
2118 warnings int
19+
20+ // PreparedStmt contains common fields shared with server.Stmt for proxy passthrough
21+ stmt.PreparedStmt
2222}
2323
2424func (s * Stmt ) ParamNum () int {
25- return s .params
25+ return s .Params
2626}
2727
2828func (s * Stmt ) ColumnNum () int {
29- return s .columns
29+ return s .Columns
3030}
3131
3232func (s * Stmt ) WarningsNum () int {
@@ -50,7 +50,7 @@ func (s *Stmt) ExecuteSelectStreaming(result *mysql.Result, perRowCb SelectPerRo
5050}
5151
5252func (s * Stmt ) Close () error {
53- if err := s .conn .writeCommandUint32 (mysql .COM_STMT_CLOSE , s .id ); err != nil {
53+ if err := s .conn .writeCommandUint32 (mysql .COM_STMT_CLOSE , s .ID ); err != nil {
5454 return errors .Trace (err )
5555 }
5656
@@ -60,10 +60,10 @@ func (s *Stmt) Close() error {
6060// https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_com_stmt_execute.html
6161func (s * Stmt ) write (args ... interface {}) error {
6262 defer clear (s .conn .queryAttributes )
63- paramsNum := s .params
63+ paramsNum := s .Params
6464
6565 if len (args ) != paramsNum {
66- return fmt .Errorf ("argument mismatch, need %d but got %d" , s .params , len (args ))
66+ return fmt .Errorf ("argument mismatch, need %d but got %d" , s .Params , len (args ))
6767 }
6868
6969 if (s .conn .capability & mysql .CLIENT_QUERY_ATTRIBUTES > 0 ) && (s .conn .includeLine >= 0 ) {
@@ -187,7 +187,7 @@ func (s *Stmt) write(args ...interface{}) error {
187187
188188 data .Write ([]byte {0 , 0 , 0 , 0 })
189189 data .WriteByte (mysql .COM_STMT_EXECUTE )
190- data .Write ([]byte {byte (s .id ), byte (s .id >> 8 ), byte (s .id >> 16 ), byte (s .id >> 24 )})
190+ data .Write ([]byte {byte (s .ID ), byte (s .ID >> 8 ), byte (s .ID >> 16 ), byte (s .ID >> 24 )})
191191
192192 flags := mysql .CURSOR_TYPE_NO_CURSOR
193193 if paramsNum > 0 {
@@ -254,15 +254,15 @@ func (c *Conn) Prepare(query string) (*Stmt, error) {
254254 pos := 1
255255
256256 // for statement id
257- s .id = binary .LittleEndian .Uint32 (data [pos :])
257+ s .ID = binary .LittleEndian .Uint32 (data [pos :])
258258 pos += 4
259259
260260 // number columns
261- s .columns = int (binary .LittleEndian .Uint16 (data [pos :]))
261+ s .Columns = int (binary .LittleEndian .Uint16 (data [pos :]))
262262 pos += 2
263263
264264 // number params
265- s .params = int (binary .LittleEndian .Uint16 (data [pos :]))
265+ s .Params = int (binary .LittleEndian .Uint16 (data [pos :]))
266266 pos += 2
267267
268268 // reserved
@@ -274,11 +274,14 @@ func (c *Conn) Prepare(query string) (*Stmt, error) {
274274 // pos += 2
275275 }
276276
277- if s .params > 0 {
278- for range s .params {
279- if _ , err := s .conn .ReadPacket (); err != nil {
277+ if s .Params > 0 {
278+ s .RawParamFields = make ([][]byte , s .Params )
279+ for i := range s .Params {
280+ data , err := s .conn .ReadPacket ()
281+ if err != nil {
280282 return nil , errors .Trace (err )
281283 }
284+ s .RawParamFields [i ] = data
282285 }
283286 if s .conn .capability & mysql .CLIENT_DEPRECATE_EOF == 0 {
284287 if packet , err := s .conn .ReadPacket (); err != nil {
@@ -289,12 +292,14 @@ func (c *Conn) Prepare(query string) (*Stmt, error) {
289292 }
290293 }
291294
292- if s .columns > 0 {
293- // TODO process when CLIENT_CACHE_METADATA enabled
294- for range s .columns {
295- if _ , err := s .conn .ReadPacket (); err != nil {
295+ if s .Columns > 0 {
296+ s .RawColumnFields = make ([][]byte , s .Columns )
297+ for i := range s .Columns {
298+ data , err := s .conn .ReadPacket ()
299+ if err != nil {
296300 return nil , errors .Trace (err )
297301 }
302+ s .RawColumnFields [i ] = data
298303 }
299304 if s .conn .capability & mysql .CLIENT_DEPRECATE_EOF == 0 {
300305 if packet , err := s .conn .ReadPacket (); err != nil {
0 commit comments