| 1387 | ***************************************************************************/ |
| 1388 | |
| 1389 | MYSQL_FIELD * |
| 1390 | unpack_fields(MYSQL *mysql, MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, |
| 1391 | my_bool default_value, uint server_capabilities) |
| 1392 | { |
| 1393 | MYSQL_ROWS *row; |
| 1394 | MYSQL_FIELD *field,*result; |
| 1395 | ulong lengths[9]; /* Max of fields */ |
| 1396 | DBUG_ENTER("unpack_fields"); |
| 1397 | |
| 1398 | field= result= (MYSQL_FIELD*) alloc_root(alloc, |
| 1399 | (uint) sizeof(*field)*fields); |
| 1400 | if (!result) |
| 1401 | { |
| 1402 | free_rows(data); /* Free old data */ |
| 1403 | set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate); |
| 1404 | DBUG_RETURN(0); |
| 1405 | } |
| 1406 | memset(field, 0, sizeof(MYSQL_FIELD)*fields); |
| 1407 | if (server_capabilities & CLIENT_PROTOCOL_41) |
| 1408 | { |
| 1409 | /* server is 4.1, and returns the new field result format */ |
| 1410 | for (row=data->data; row ; row = row->next,field++) |
| 1411 | { |
| 1412 | uchar *pos; |
| 1413 | /* fields count may be wrong */ |
| 1414 | DBUG_ASSERT((uint) (field - result) < fields); |
| 1415 | cli_fetch_lengths(&lengths[0], row->data, default_value ? 8 : 7); |
| 1416 | field->catalog= strmake_root(alloc,(char*) row->data[0], lengths[0]); |
| 1417 | field->db= strmake_root(alloc,(char*) row->data[1], lengths[1]); |
| 1418 | field->table= strmake_root(alloc,(char*) row->data[2], lengths[2]); |
| 1419 | field->org_table= strmake_root(alloc,(char*) row->data[3], lengths[3]); |
| 1420 | field->name= strmake_root(alloc,(char*) row->data[4], lengths[4]); |
| 1421 | field->org_name= strmake_root(alloc,(char*) row->data[5], lengths[5]); |
| 1422 | |
| 1423 | field->catalog_length= lengths[0]; |
| 1424 | field->db_length= lengths[1]; |
| 1425 | field->table_length= lengths[2]; |
| 1426 | field->org_table_length= lengths[3]; |
| 1427 | field->name_length= lengths[4]; |
| 1428 | field->org_name_length= lengths[5]; |
| 1429 | |
| 1430 | /* Unpack fixed length parts */ |
| 1431 | if (lengths[6] != 12) |
| 1432 | { |
| 1433 | /* malformed packet. signal an error. */ |
| 1434 | free_rows(data); /* Free old data */ |
| 1435 | set_mysql_error(mysql, CR_MALFORMED_PACKET, unknown_sqlstate); |
| 1436 | DBUG_RETURN(0); |
| 1437 | } |
| 1438 | |
| 1439 | pos= (uchar*) row->data[6]; |
| 1440 | field->charsetnr= uint2korr(pos); |
| 1441 | field->length= (uint) uint4korr(pos+2); |
| 1442 | field->type= (enum enum_field_types) pos[6]; |
| 1443 | field->flags= uint2korr(pos+7); |
| 1444 | field->decimals= (uint) pos[9]; |
| 1445 | |
| 1446 | if (IS_NUM(field->type)) |
no test coverage detected