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

Method reoptimize

sql/sql_select.cc:32970–33038  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

32968*/
32969
32970JOIN::enum_reopt_result
32971JOIN::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;

Callers

nothing calls this directly

Calls 7

update_ref_and_keysFunction · 0.85
delete_dynamicFunction · 0.85
allocate_dynamicFunction · 0.85
sort_and_filter_keyuseFunction · 0.85
optimize_keyuseFunction · 0.85
optimize_semijoin_nestsFunction · 0.85
choose_planFunction · 0.85

Tested by

no test coverage detected