| 32968 | */ |
| 32969 | |
| 32970 | JOIN::enum_reopt_result |
| 32971 | JOIN::reoptimize(Item *added_where, table_map join_tables, |
| 32972 | Join_plan_state *save_to) |
| 32973 | { |
| 32974 | DYNAMIC_ARRAY added_keyuse; |
| 32975 | SARGABLE_PARAM *sargables= 0; /* Used only as a dummy parameter. */ |
| 32976 | size_t org_keyuse_elements; |
| 32977 | |
| 32978 | /* Re-run the REF optimizer to take into account the new conditions. */ |
| 32979 | if (update_ref_and_keys(thd, &added_keyuse, join_tab, table_count, |
| 32980 | added_where, ~outer_join, select_lex, &sargables)) |
| 32981 | { |
| 32982 | delete_dynamic(&added_keyuse); |
| 32983 | return REOPT_ERROR; |
| 32984 | } |
| 32985 | |
| 32986 | if (!added_keyuse.elements) |
| 32987 | { |
| 32988 | delete_dynamic(&added_keyuse); |
| 32989 | return REOPT_OLD_PLAN; |
| 32990 | } |
| 32991 | |
| 32992 | if (save_to) |
| 32993 | save_query_plan(save_to); |
| 32994 | else |
| 32995 | reset_query_plan(); |
| 32996 | |
| 32997 | if (!keyuse.buffer && |
| 32998 | my_init_dynamic_array(thd->mem_root->psi_key, &keyuse, sizeof(KEYUSE), |
| 32999 | 20, 64, MYF(MY_THREAD_SPECIFIC))) |
| 33000 | { |
| 33001 | delete_dynamic(&added_keyuse); |
| 33002 | return REOPT_ERROR; |
| 33003 | } |
| 33004 | |
| 33005 | org_keyuse_elements= save_to ? save_to->keyuse.elements : keyuse.elements; |
| 33006 | allocate_dynamic(&keyuse, org_keyuse_elements + added_keyuse.elements); |
| 33007 | |
| 33008 | /* If needed, add the access methods from the original query plan. */ |
| 33009 | if (save_to) |
| 33010 | { |
| 33011 | DBUG_ASSERT(!keyuse.elements); |
| 33012 | keyuse.elements= save_to->keyuse.elements; |
| 33013 | if (size_t e= keyuse.elements) |
| 33014 | memcpy(keyuse.buffer, |
| 33015 | save_to->keyuse.buffer, e * keyuse.size_of_element); |
| 33016 | } |
| 33017 | |
| 33018 | /* Add the new access methods to the keyuse array. */ |
| 33019 | memcpy(keyuse.buffer + keyuse.elements * keyuse.size_of_element, |
| 33020 | added_keyuse.buffer, |
| 33021 | (size_t) added_keyuse.elements * added_keyuse.size_of_element); |
| 33022 | keyuse.elements+= added_keyuse.elements; |
| 33023 | /* added_keyuse contents is copied, and it is no longer needed. */ |
| 33024 | delete_dynamic(&added_keyuse); |
| 33025 | |
| 33026 | if (sort_and_filter_keyuse(this, &keyuse, true)) |
| 33027 | return REOPT_ERROR; |
nothing calls this directly
no test coverage detected