(data []byte)
| 99 | } |
| 100 | |
| 101 | func (c *Conn) handleStmtExecute(data []byte) (*Result, error) { |
| 102 | if len(data) < 9 { |
| 103 | return nil, ErrMalformPacket |
| 104 | } |
| 105 | |
| 106 | pos := 0 |
| 107 | id := binary.LittleEndian.Uint32(data[0:4]) |
| 108 | pos += 4 |
| 109 | |
| 110 | s, ok := c.stmts[id] |
| 111 | if !ok { |
| 112 | return nil, NewDefaultError(ER_UNKNOWN_STMT_HANDLER, |
| 113 | strconv.FormatUint(uint64(id), 10), "stmt_execute") |
| 114 | } |
| 115 | |
| 116 | flag := data[pos] |
| 117 | pos++ |
| 118 | // now we only support CURSOR_TYPE_NO_CURSOR flag |
| 119 | if flag != 0 { |
| 120 | return nil, NewError(ER_UNKNOWN_ERROR, fmt.Sprintf("unsupported flag %d", flag)) |
| 121 | } |
| 122 | |
| 123 | // skip iteration-count, always 1 |
| 124 | pos += 4 |
| 125 | |
| 126 | var nullBitmaps []byte |
| 127 | var paramTypes []byte |
| 128 | var paramValues []byte |
| 129 | |
| 130 | paramNum := s.Params |
| 131 | |
| 132 | if paramNum > 0 { |
| 133 | nullBitmapLen := (s.Params + 7) >> 3 |
| 134 | if len(data) < (pos + nullBitmapLen + 1) { |
| 135 | return nil, ErrMalformPacket |
| 136 | } |
| 137 | nullBitmaps = data[pos : pos+nullBitmapLen] |
| 138 | pos += nullBitmapLen |
| 139 | |
| 140 | // new param bound flag |
| 141 | if data[pos] == 1 { |
| 142 | pos++ |
| 143 | if len(data) < (pos + (paramNum << 1)) { |
| 144 | return nil, ErrMalformPacket |
| 145 | } |
| 146 | |
| 147 | paramTypes = data[pos : pos+(paramNum<<1)] |
| 148 | pos += paramNum << 1 |
| 149 | |
| 150 | paramValues = data[pos:] |
| 151 | } |
| 152 | |
| 153 | if err := c.bindStmtArgs(s, nullBitmaps, paramTypes, paramValues); err != nil { |
| 154 | return nil, errors.Trace(err) |
| 155 | } |
| 156 | } |
| 157 | |
| 158 | var r *Result |
no test coverage detected