MCPcopy Create free account
hub / github.com/Meituan-Dianping/SQLAdvisor / unpack_fields

Function unpack_fields

sql-common/client.c:1389–1502  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1387***************************************************************************/
1388
1389MYSQL_FIELD *
1390unpack_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))

Callers 1

cli_read_query_resultFunction · 0.85

Calls 6

alloc_rootFunction · 0.85
free_rowsFunction · 0.85
set_mysql_errorFunction · 0.85
cli_fetch_lengthsFunction · 0.85
strmake_rootFunction · 0.85
strdup_rootFunction · 0.85

Tested by

no test coverage detected