| 15190 | } |
| 15191 | |
| 15192 | static |
| 15193 | bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys) |
| 15194 | { |
| 15195 | TABLE *table= keyuse->table; |
| 15196 | if (table->alloc_keys(keys)) |
| 15197 | return TRUE; |
| 15198 | uint key_count= 0; |
| 15199 | KEYUSE *first_keyuse= keyuse; |
| 15200 | uint prev_part= keyuse->keypart; |
| 15201 | uint parts= 0; |
| 15202 | uint i= 0; |
| 15203 | |
| 15204 | for ( ; i < count && key_count < keys; ) |
| 15205 | { |
| 15206 | do |
| 15207 | { |
| 15208 | keyuse->key= table->s->keys; |
| 15209 | keyuse->keypart_map= (key_part_map)1 << parts; |
| 15210 | keyuse++; |
| 15211 | i++; |
| 15212 | } |
| 15213 | while (i < count && keyuse->used_tables == first_keyuse->used_tables && |
| 15214 | keyuse->keypart == prev_part); |
| 15215 | parts++; |
| 15216 | if (i < count && keyuse->used_tables == first_keyuse->used_tables) |
| 15217 | { |
| 15218 | prev_part= keyuse->keypart; |
| 15219 | } |
| 15220 | else |
| 15221 | { |
| 15222 | KEYUSE *save_first_keyuse= first_keyuse; |
| 15223 | if (table->check_tmp_key(table->s->keys, parts, |
| 15224 | get_next_field_for_derived_key_simple, |
| 15225 | (uchar *) &first_keyuse)) |
| 15226 | |
| 15227 | { |
| 15228 | JOIN_TAB *tab; |
| 15229 | first_keyuse= save_first_keyuse; |
| 15230 | if (table->add_tmp_key(table->s->keys, parts, |
| 15231 | get_next_field_for_derived_key, |
| 15232 | (uchar *) &first_keyuse, |
| 15233 | FALSE)) |
| 15234 | return TRUE; |
| 15235 | table->reginfo.join_tab->keys.set_bit(table->s->keys - 1); |
| 15236 | tab= table->reginfo.join_tab; |
| 15237 | for (uint i=0; i < parts; i++) |
| 15238 | tab->key_dependent|= save_first_keyuse[i].used_tables; |
| 15239 | } |
| 15240 | else |
| 15241 | { |
| 15242 | /* Mark keyuses for this key to be excluded */ |
| 15243 | for (KEYUSE *curr=save_first_keyuse; curr < keyuse; curr++) |
| 15244 | { |
| 15245 | curr->key= MAX_KEY; |
| 15246 | } |
| 15247 | } |
| 15248 | first_keyuse= keyuse; |
| 15249 | key_count++; |
no test coverage detected