| 15287 | */ |
| 15288 | |
| 15289 | static |
| 15290 | bool generate_derived_keys(DYNAMIC_ARRAY *keyuse_array) |
| 15291 | { |
| 15292 | KEYUSE *keyuse, *end_keyuse; |
| 15293 | size_t elements= keyuse_array->elements; |
| 15294 | TABLE *prev_table= 0; |
| 15295 | |
| 15296 | DBUG_ASSERT(elements > 0); |
| 15297 | /* The last element is an end marker */ |
| 15298 | DBUG_ASSERT(dynamic_element(keyuse_array, elements-1, |
| 15299 | KEYUSE*)[0].table == 0); |
| 15300 | |
| 15301 | for (keyuse= dynamic_element(keyuse_array, 0, KEYUSE*), |
| 15302 | end_keyuse= keyuse + elements - 1; |
| 15303 | keyuse < end_keyuse; |
| 15304 | keyuse++) |
| 15305 | { |
| 15306 | DBUG_ASSERT(keyuse->table); |
| 15307 | |
| 15308 | KEYUSE *first_table_keyuse= NULL; |
| 15309 | table_map last_used_tables= 0; |
| 15310 | uint count= 0; |
| 15311 | uint keys= 0; |
| 15312 | TABLE_LIST *derived= NULL; |
| 15313 | |
| 15314 | if (keyuse->table != prev_table) |
| 15315 | derived= keyuse->table->pos_in_table_list; |
| 15316 | |
| 15317 | if (!derived->is_materialized_derived()) |
| 15318 | continue; |
| 15319 | |
| 15320 | for (;;) |
| 15321 | { |
| 15322 | if (keyuse->table != prev_table) |
| 15323 | { |
| 15324 | prev_table= keyuse->table; |
| 15325 | while (keyuse->table == prev_table && keyuse->key != MAX_KEY) |
| 15326 | keyuse++; |
| 15327 | if (keyuse->table != prev_table) |
| 15328 | { |
| 15329 | keyuse--; |
| 15330 | break; |
| 15331 | } |
| 15332 | first_table_keyuse= keyuse; |
| 15333 | last_used_tables= keyuse->used_tables; |
| 15334 | count= 0; |
| 15335 | keys= 0; |
| 15336 | } |
| 15337 | else if (keyuse->used_tables != last_used_tables) |
| 15338 | { |
| 15339 | keys++; |
| 15340 | last_used_tables= keyuse->used_tables; |
| 15341 | } |
| 15342 | count++; |
| 15343 | keyuse++; |
| 15344 | if (keyuse->table != prev_table) |
| 15345 | { |
| 15346 | if (generate_derived_keys_for_table(first_table_keyuse, count, ++keys)) |
no test coverage detected