| 1121 | ***************************************************************************/ |
| 1122 | |
| 1123 | MYSQL_FIELD * |
| 1124 | unpack_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 | { |
no test coverage detected