@@ -13,7 +13,6 @@ import (
1313 "fmt"
1414
1515 "github.com/xelabs/go-mysqlstack/sqldb"
16-
1716 "github.com/xelabs/go-mysqlstack/sqlparser/depends/common"
1817 querypb "github.com/xelabs/go-mysqlstack/sqlparser/depends/query"
1918 "github.com/xelabs/go-mysqlstack/sqlparser/depends/sqltypes"
@@ -26,6 +25,7 @@ type Statement struct {
2625 ColumnCount uint16
2726 ParamCount uint16
2827 Warnings uint16
28+ ParamsType []int32
2929 ColumnNames []string
3030
3131 BindVars map [string ]* querypb.BindVariable
@@ -156,87 +156,79 @@ func PackStatementExecute(stmtID uint32, parameters []sqltypes.Value) ([]byte, e
156156}
157157
158158// UnPackStatementExecute -- unpack the stmt-execute packet from client.
159- func UnPackStatementExecute (data []byte , paramsCount uint16 , parseValueFn func (* common.Buffer , querypb.Type ) (interface {}, error )) ( * Statement , error ) {
159+ func UnPackStatementExecute (data []byte , prepare * Statement , parseValueFn func (* common.Buffer , querypb.Type ) (interface {}, error )) error {
160160 var err error
161- var paramsType []int32
162-
163- stmt := & Statement {}
164161 bitMap := make ([]byte , 0 )
165162 buf := common .ReadBuffer (data )
166163
167- // statement ID
168- if stmt .ID , err = buf .ReadU32 (); err != nil {
169- return nil , sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading statement ID failed" )
164+ if _ , err = buf .ReadU32 (); err != nil {
165+ return sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading statement ID failed" )
170166 }
171167
172168 // cursor type flags
173169 if _ , err = buf .ReadU8 (); err != nil {
174- return nil , sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading cursor type flags failed" )
170+ return sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading cursor type flags failed" )
175171 }
176172
177173 // iteration count
178174 var itercount uint32
179175 if itercount , err = buf .ReadU32 (); err != nil {
180- return nil , sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading iteration count failed" )
176+ return sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading iteration count failed" )
181177 }
182178 if itercount != 1 {
183- return nil , sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "iteration count is not equal to 1" )
179+ return sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "iteration count is not equal to 1" )
184180 }
185181
186- if paramsCount > 0 {
187- // Init.
188- paramsType = make ([]int32 , paramsCount )
189- stmt .BindVars = make (map [string ]* querypb.BindVariable )
190-
191- if bitMap , err = buf .ReadBytes (int ((paramsCount + 7 ) / 8 )); err != nil {
192- return nil , sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading NULL-bitmap failed" )
182+ if prepare .ParamCount > 0 {
183+ if bitMap , err = buf .ReadBytes (int ((prepare .ParamCount + 7 ) / 8 )); err != nil {
184+ return sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading NULL-bitmap failed" )
193185 }
194186
195187 var newParamsBoundFlag byte
196188 if newParamsBoundFlag , err = buf .ReadU8 (); err != nil {
197- return nil , sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading NULL-bitmap failed" )
189+ return sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading NULL-bitmap failed" )
198190 }
199191 if newParamsBoundFlag == 0x01 {
200192 var mysqlType , flags byte
201- for i := uint16 (0 ); i < paramsCount ; i ++ {
193+ for i := uint16 (0 ); i < prepare . ParamCount ; i ++ {
202194 if mysqlType , err = buf .ReadU8 (); err != nil {
203- return nil , sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading parameter type failed" )
195+ return sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading parameter type failed" )
204196 }
205197
206198 if flags , err = buf .ReadU8 (); err != nil {
207- return nil , sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading parameter flags failed" )
199+ return sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , "reading parameter flags failed" )
208200 }
209201 // Convert MySQL type to Vitess type.
210202 valType , err := sqltypes .MySQLToType (int64 (mysqlType ), int64 (flags ))
211203 if err != nil {
212- return nil , sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , fmt .Sprintf ("MySQLToType(%v,%v) failed: %v" , mysqlType , flags , err ))
204+ return sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , fmt .Sprintf ("MySQLToType(%v,%v) failed: %v" , mysqlType , flags , err ))
213205 }
214- paramsType [i ] = int32 (valType )
206+ prepare . ParamsType [i ] = int32 (valType )
215207 }
216208 }
217209
218- for i := uint16 (0 ); i < paramsCount ; i ++ {
210+ for i := uint16 (0 ); i < prepare . ParamCount ; i ++ {
219211 var val interface {}
220- if paramsType [i ] == int32 (sqltypes .Text ) || paramsType [i ] == int32 (sqltypes .Blob ) {
212+ if prepare . ParamsType [i ] == int32 (sqltypes .Text ) || prepare . ParamsType [i ] == int32 (sqltypes .Blob ) {
221213 continue
222214 }
223215
224216 if (bitMap [i / 8 ] & (1 << uint (i % 8 ))) > 0 {
225217 val , err = parseValueFn (buf , sqltypes .Null )
226218 } else {
227- val , err = parseValueFn (buf , querypb .Type (paramsType [i ]))
219+ val , err = parseValueFn (buf , querypb .Type (prepare . ParamsType [i ]))
228220 }
229221 if err != nil {
230- return nil , sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , fmt .Sprintf ("decoding parameter value failed(%v) failed: %v" , paramsType [i ], err ))
222+ return sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , fmt .Sprintf ("decoding parameter value failed(%v) failed: %v" , prepare . ParamsType [i ], err ))
231223 }
232224
233225 // If value is nil, must set bind variables to nil.
234226 bv , err := sqltypes .BuildBindVariable (val )
235227 if err != nil {
236- return nil , sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , fmt .Sprintf ("build converted parameters value failed: %v" , err ))
228+ return sqldb .NewSQLErrorf (sqldb .ER_MALFORMED_PACKET , fmt .Sprintf ("build converted parameters value failed: %v" , err ))
237229 }
238- stmt .BindVars [fmt .Sprintf ("v%d" , i + 1 )] = bv
230+ prepare .BindVars [fmt .Sprintf ("v%d" , i + 1 )] = bv
239231 }
240232 }
241- return stmt , nil
233+ return nil
242234}
0 commit comments