MCPcopy Create free account
hub / github.com/MariaDB/server / unpack_fields

Function unpack_fields

sql-common/client.c:1123–1258  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1121***************************************************************************/
1122
1123MYSQL_FIELD *
1124unpack_fields(MYSQL *mysql, MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
1125 my_bool default_value, uint server_capabilities)
1126{
1127 MYSQL_ROWS *row;
1128 MYSQL_FIELD *field,*result;
1129 ulong lengths[9]; /* Max of fields */
1130 DBUG_ENTER("unpack_fields");
1131
1132 field= result= (MYSQL_FIELD*) alloc_root(alloc,
1133 (uint) sizeof(*field)*fields);
1134 if (!result)
1135 {
1136 free_rows(data); /* Free old data */
1137 set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
1138 DBUG_RETURN(0);
1139 }
1140 bzero((char*) field, (uint) sizeof(MYSQL_FIELD)*fields);
1141 if (server_capabilities & CLIENT_PROTOCOL_41)
1142 {
1143 /* server is 4.1, and returns the new field result format */
1144 for (row=data->data; row ; row = row->next,field++)
1145 {
1146 uchar *pos;
1147 /* fields count may be wrong */
1148 if (field >= result + fields)
1149 goto err;
1150
1151 cli_fetch_lengths(&lengths[0], row->data, default_value ? 8 : 7);
1152 field->catalog= strmake_root(alloc,(char*) row->data[0], lengths[0]);
1153 field->db= strmake_root(alloc,(char*) row->data[1], lengths[1]);
1154 field->table= strmake_root(alloc,(char*) row->data[2], lengths[2]);
1155 field->org_table= strmake_root(alloc,(char*) row->data[3], lengths[3]);
1156 field->name= strmake_root(alloc,(char*) row->data[4], lengths[4]);
1157 field->org_name= strmake_root(alloc,(char*) row->data[5], lengths[5]);
1158
1159 field->catalog_length= lengths[0];
1160 field->db_length= lengths[1];
1161 field->table_length= lengths[2];
1162 field->org_table_length= lengths[3];
1163 field->name_length= lengths[4];
1164 field->org_name_length= lengths[5];
1165
1166 /* Unpack fixed length parts */
1167 if (lengths[6] != 12)
1168 goto err;
1169
1170 pos= (uchar*) row->data[6];
1171 field->charsetnr= uint2korr(pos);
1172 field->length= (uint) uint4korr(pos+2);
1173 field->type= (enum enum_field_types) pos[6];
1174 field->flags= uint2korr(pos+7);
1175 field->decimals= (uint) pos[9];
1176
1177 if (IS_NUM(field->type))
1178 field->flags|= NUM_FLAG;
1179 if (default_value && row->data[7])
1180 {

Callers 4

cli_read_query_resultFunction · 0.85
cli_list_fieldsFunction · 0.85
libmysql.cFile · 0.85
cli_read_prepare_resultFunction · 0.85

Calls 9

alloc_rootFunction · 0.85
free_rowsFunction · 0.85
set_mysql_errorFunction · 0.85
cli_fetch_lengthsFunction · 0.85
strmake_rootFunction · 0.85
uint2korrFunction · 0.85
uint4korrFunction · 0.85
uint3korrFunction · 0.85
free_rootFunction · 0.85

Tested by

no test coverage detected