https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_binary_resultset.html#sect_protocol_binary_resultset_row
(dest []driver.Value)
| 1264 | |
| 1265 | // https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_binary_resultset.html#sect_protocol_binary_resultset_row |
| 1266 | func (rows *binaryRows) readRow(dest []driver.Value) error { |
| 1267 | data, err := rows.mc.readPacket() |
| 1268 | if err != nil { |
| 1269 | return err |
| 1270 | } |
| 1271 | |
| 1272 | // packet indicator [1 byte] |
| 1273 | if data[0] != iOK { |
| 1274 | // EOF/OK Packet |
| 1275 | if data[0] == iEOF { |
| 1276 | if rows.mc.capabilities&clientDeprecateEOF == 0 { |
| 1277 | // EOF packet |
| 1278 | rows.mc.status = readStatus(data[3:]) |
| 1279 | } else { |
| 1280 | // OK Packet with an 0xFE header |
| 1281 | _, _, n := readLengthEncodedInteger(data[1:]) |
| 1282 | _, _, m := readLengthEncodedInteger(data[1+n:]) |
| 1283 | rows.mc.status = readStatus(data[1+n+m:]) |
| 1284 | } |
| 1285 | rows.rs.done = true |
| 1286 | if !rows.HasNextResultSet() { |
| 1287 | rows.mc = nil |
| 1288 | } |
| 1289 | return io.EOF |
| 1290 | } |
| 1291 | mc := rows.mc |
| 1292 | rows.mc = nil |
| 1293 | |
| 1294 | // Error otherwise |
| 1295 | return mc.handleErrorPacket(data) |
| 1296 | } |
| 1297 | |
| 1298 | // NULL-bitmap, [(column-count + 7 + 2) / 8 bytes] |
| 1299 | pos := 1 + (len(dest)+7+2)>>3 |
| 1300 | nullMask := data[1:pos] |
| 1301 | |
| 1302 | for i := range dest { |
| 1303 | // Field is NULL |
| 1304 | // (byte >> bit-pos) % 2 == 1 |
| 1305 | if ((nullMask[(i+2)>>3] >> uint((i+2)&7)) & 1) == 1 { |
| 1306 | dest[i] = nil |
| 1307 | continue |
| 1308 | } |
| 1309 | |
| 1310 | // Convert to byte-coded string |
| 1311 | switch rows.rs.columns[i].fieldType { |
| 1312 | case fieldTypeNULL: |
| 1313 | dest[i] = nil |
| 1314 | continue |
| 1315 | |
| 1316 | // Numeric Types |
| 1317 | case fieldTypeTiny: |
| 1318 | if rows.rs.columns[i].flags&flagUnsigned != 0 { |
| 1319 | dest[i] = int64(data[pos]) |
| 1320 | } else { |
| 1321 | dest[i] = int64(int8(data[pos])) |
| 1322 | } |
| 1323 | pos++ |
no test coverage detected