The world's most popular open source database
#include "mysql_priv.h"#include "sql_select.h"#include "sql_cursor.h"#include <m_ctype.h>#include <hash.h>#include <ft_global.h>Include dependency graph for sql_select.cc:

Go to the source code of this file.
Classes | |
| struct | key_field_t |
| class | COND_CMP |
Defines | |
| #define | KEY_OPTIMIZE_EXISTS 1 |
| #define | KEY_OPTIMIZE_REF_OR_NULL 2 |
| #define | FT_KEYPART (MAX_REF_PARTS+10) |
| #define | STRING_TOTAL_LENGTH_TO_PACK_ROWS 128 |
| #define | AVG_STRING_LENGTH_TO_PACK_ROWS 64 |
| #define | RATIO_TO_PACK_ROWS 2 |
| #define | MIN_STRING_LENGTH_TO_PACK_ROWS 10 |
Typedefs | |
| typedef key_field_t | KEY_FIELD |
Functions | |
| static void | optimize_keyuse (JOIN *join, DYNAMIC_ARRAY *keyuse_array) |
| static bool | make_join_statistics (JOIN *join, TABLE_LIST *leaves, COND *conds, DYNAMIC_ARRAY *keyuse) |
| static bool | update_ref_and_keys (THD *thd, DYNAMIC_ARRAY *keyuse, JOIN_TAB *join_tab, uint tables, COND *conds, COND_EQUAL *cond_equal, table_map table_map, SELECT_LEX *select_lex) |
| static int | sort_keyuse (KEYUSE *a, KEYUSE *b) |
| static void | set_position (JOIN *join, uint index, JOIN_TAB *table, KEYUSE *key) |
| static bool | create_ref_for_key (JOIN *join, JOIN_TAB *j, KEYUSE *org_keyuse, table_map used_tables) |
| static void | choose_plan (JOIN *join, table_map join_tables) |
| static void | best_access_path (JOIN *join, JOIN_TAB *s, THD *thd, table_map remaining_tables, uint idx, double record_count, double read_time) |
| static void | optimize_straight_join (JOIN *join, table_map join_tables) |
| static void | greedy_search (JOIN *join, table_map remaining_tables, uint depth, uint prune_level) |
| static void | best_extension_by_limited_search (JOIN *join, table_map remaining_tables, uint idx, double record_count, double read_time, uint depth, uint prune_level) |
| static uint | determine_search_depth (JOIN *join) |
| static int | join_tab_cmp (const void *ptr1, const void *ptr2) |
| static int | join_tab_cmp_straight (const void *ptr1, const void *ptr2) |
| static void | find_best (JOIN *join, table_map rest_tables, uint index, double record_count, double read_time) |
| static uint | cache_record_length (JOIN *join, uint index) |
| static double | prev_record_reads (JOIN *join, table_map found_ref) |
| static bool | get_best_combination (JOIN *join) |
| static store_key * | get_store_key (THD *thd, KEYUSE *keyuse, table_map used_tables, KEY_PART_INFO *key_part, char *key_buff, uint maybe_null) |
| static bool | make_simple_join (JOIN *join, TABLE *tmp_table) |
| static void | make_outerjoin_info (JOIN *join) |
| static bool | make_join_select (JOIN *join, SQL_SELECT *select, COND *item) |
| static void | make_join_readinfo (JOIN *join, uint options) |
| static bool | only_eq_ref_tables (JOIN *join, ORDER *order, table_map tables) |
| static void | update_depend_map (JOIN *join) |
| static void | update_depend_map (JOIN *join, ORDER *order) |
| static ORDER * | remove_const (JOIN *join, ORDER *first_order, COND *cond, bool change_list, bool *simple_order) |
| static int | return_zero_rows (JOIN *join, select_result *res, TABLE_LIST *tables, List< Item > &fields, bool send_row, uint select_options, const char *info, Item *having) |
| static COND * | build_equal_items (THD *thd, COND *cond, COND_EQUAL *inherited, List< TABLE_LIST > *join_list, COND_EQUAL **cond_equal_ref) |
| static COND * | substitute_for_best_equal_field (COND *cond, COND_EQUAL *cond_equal, void *table_join_idx) |
| static COND * | simplify_joins (JOIN *join, List< TABLE_LIST > *join_list, COND *conds, bool top) |
| static bool | check_interleaving_with_nj (JOIN_TAB *last, JOIN_TAB *next) |
| static void | restore_prev_nj_state (JOIN_TAB *last) |
| static void | reset_nj_counters (List< TABLE_LIST > *join_list) |
| static uint | build_bitmap_for_nested_joins (List< TABLE_LIST > *join_list, uint first_unused) |
| static COND * | optimize_cond (JOIN *join, COND *conds, List< TABLE_LIST > *join_list, Item::cond_result *cond_value) |
| static bool | resolve_nested_join (TABLE_LIST *table) |
| static bool | const_expression_in_where (COND *conds, Item *item, Item **comp_item) |
| static bool | open_tmp_table (TABLE *table) |
| static bool | create_myisam_tmp_table (TABLE *table, TMP_TABLE_PARAM *param, ulong options) |
| static int | do_select (JOIN *join, List< Item > *fields, TABLE *tmp_table, Procedure *proc) |
| static enum_nested_loop_state | evaluate_join_record (JOIN *join, JOIN_TAB *join_tab, int error, my_bool *report_error) |
| static enum_nested_loop_state | evaluate_null_complemented_join_record (JOIN *join, JOIN_TAB *join_tab) |
| static enum_nested_loop_state | flush_cached_records (JOIN *join, JOIN_TAB *join_tab, bool skip_last) |
| static enum_nested_loop_state | end_send (JOIN *join, JOIN_TAB *join_tab, bool end_of_records) |
| static enum_nested_loop_state | end_send_group (JOIN *join, JOIN_TAB *join_tab, bool end_of_records) |
| static enum_nested_loop_state | end_write (JOIN *join, JOIN_TAB *join_tab, bool end_of_records) |
| static enum_nested_loop_state | end_update (JOIN *join, JOIN_TAB *join_tab, bool end_of_records) |
| static enum_nested_loop_state | end_unique_update (JOIN *join, JOIN_TAB *join_tab, bool end_of_records) |
| static enum_nested_loop_state | end_write_group (JOIN *join, JOIN_TAB *join_tab, bool end_of_records) |
| static int | test_if_group_changed (List< Cached_item > &list) |
| static int | join_read_const_table (JOIN_TAB *tab, POSITION *pos) |
| static int | join_read_system (JOIN_TAB *tab) |
| static int | join_read_const (JOIN_TAB *tab) |
| static int | join_read_key (JOIN_TAB *tab) |
| static int | join_read_always_key (JOIN_TAB *tab) |
| static int | join_read_last_key (JOIN_TAB *tab) |
| static int | join_no_more_records (READ_RECORD *info) |
| static int | join_read_next (READ_RECORD *info) |
| static int | join_init_quick_read_record (JOIN_TAB *tab) |
| static int | test_if_quick_select (JOIN_TAB *tab) |
| static int | join_init_read_record (JOIN_TAB *tab) |
| static int | join_read_first (JOIN_TAB *tab) |
| static int | join_read_next_same (READ_RECORD *info) |
| static int | join_read_last (JOIN_TAB *tab) |
| static int | join_read_prev_same (READ_RECORD *info) |
| static int | join_read_prev (READ_RECORD *info) |
| static int | join_ft_read_first (JOIN_TAB *tab) |
| static int | join_ft_read_next (READ_RECORD *info) |
| static int | join_read_always_key_or_null (JOIN_TAB *tab) |
| static int | join_read_next_same_or_null (READ_RECORD *info) |
| static COND * | make_cond_for_table (COND *cond, table_map table, table_map used_table) |
| static Item * | part_of_refkey (TABLE *form, Field *field) |
| uint | find_shortest_key (TABLE *table, const key_map *usable_keys) |
| static bool | test_if_skip_sort_order (JOIN_TAB *tab, ORDER *order, ha_rows select_limit, bool no_changes) |
| static bool | list_contains_unique_index (TABLE *table, bool(*find_func)(Field *, void *), void *data) |
| static bool | find_field_in_item_list (Field *field, void *data) |
| static bool | find_field_in_order_list (Field *field, void *data) |
| static int | create_sort_index (THD *thd, JOIN *join, ORDER *order, ha_rows filesort_limit, ha_rows select_limit) |
| static int | remove_duplicates (JOIN *join, TABLE *entry, List< Item > &fields, Item *having) |
| static int | remove_dup_with_compare (THD *thd, TABLE *entry, Field **field, ulong offset, Item *having) |
| static int | remove_dup_with_hash_index (THD *thd, TABLE *table, uint field_count, Field **first_field, ulong key_length, Item *having) |
| static int | join_init_cache (THD *thd, JOIN_TAB *tables, uint table_count) |
| static ulong | used_blob_length (CACHE_FIELD **ptr) |
| static bool | store_record_in_cache (JOIN_CACHE *cache) |
| static void | reset_cache_read (JOIN_CACHE *cache) |
| static void | reset_cache_write (JOIN_CACHE *cache) |
| static void | read_cached_record (JOIN_TAB *tab) |
| static bool | cmp_buffer_with_ref (JOIN_TAB *tab) |
| static bool | setup_new_fields (THD *thd, List< Item > &fields, List< Item > &all_fields, ORDER *new_order) |
| static ORDER * | create_distinct_group (THD *thd, Item **ref_pointer_array, ORDER *order, List< Item > &fields, bool *all_order_by_fields_used) |
| static bool | test_if_subpart (ORDER *a, ORDER *b) |
| static TABLE * | get_sort_by_table (ORDER *a, ORDER *b, TABLE_LIST *tables) |
| static void | calc_group_buffer (JOIN *join, ORDER *group) |
| static bool | make_group_fields (JOIN *main_join, JOIN *curr_join) |
| static bool | alloc_group_fields (JOIN *join, ORDER *group) |
| static bool | change_to_use_tmp_fields (THD *thd, Item **ref_pointer_array, List< Item > &new_list1, List< Item > &new_list2, uint elements, List< Item > &items) |
| static bool | change_refs_to_tmp_fields (THD *thd, Item **ref_pointer_array, List< Item > &new_list1, List< Item > &new_list2, uint elements, List< Item > &items) |
| static void | init_tmptable_sum_functions (Item_sum **func) |
| static void | update_tmptable_sum_func (Item_sum **func, TABLE *tmp_table) |
| static void | copy_sum_funcs (Item_sum **func_ptr, Item_sum **end) |
| static bool | add_ref_to_table_cond (THD *thd, JOIN_TAB *join_tab) |
| static bool | setup_sum_funcs (THD *thd, Item_sum **func_ptr) |
| static bool | init_sum_functions (Item_sum **func, Item_sum **end) |
| static bool | update_sum_func (Item_sum **func) |
| static void | select_describe (JOIN *join, bool need_tmp_table, bool need_order, bool distinct, const char *message=NullS) |
| static Item * | remove_additional_cond (Item *conds) |
| static void | add_group_and_distinct_keys (JOIN *join, JOIN_TAB *join_tab) |
| bool | handle_select (THD *thd, LEX *lex, select_result *result, ulong setup_tables_done_option) |
| int | setup_without_group (THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, TABLE_LIST *leaves, List< Item > &fields, List< Item > &all_fields, COND **conds, ORDER *order, ORDER *group, bool *hidden_group_fields) |
| bool | mysql_select (THD *thd, Item ***rref_pointer_array, TABLE_LIST *tables, uint wild_num, List< Item > &fields, COND *conds, uint og_num, ORDER *order, ORDER *group, Item *having, ORDER *proc_param, ulong select_options, select_result *result, SELECT_LEX_UNIT *unit, SELECT_LEX *select_lex) |
| static ha_rows | get_quick_record_count (THD *thd, SQL_SELECT *select, TABLE *table, const key_map *keys, ha_rows limit) |
| static KEY_FIELD * | merge_key_fields (KEY_FIELD *start, KEY_FIELD *new_fields, KEY_FIELD *end, uint and_level) |
| static void | add_key_field (KEY_FIELD **key_fields, uint and_level, Item_func *cond, Field *field, bool eq_func, Item **value, uint num_values, table_map usable_tables) |
| static void | add_key_equal_fields (KEY_FIELD **key_fields, uint and_level, Item_func *cond, Item_field *field_item, bool eq_func, Item **val, uint num_values, table_map usable_tables) |
| static void | add_key_fields (KEY_FIELD **key_fields, uint *and_level, COND *cond, table_map usable_tables) |
| static uint | max_part_bit (key_part_map bits) |
| static void | add_key_part (DYNAMIC_ARRAY *keyuse_array, KEY_FIELD *key_field) |
| static void | add_ft_keys (DYNAMIC_ARRAY *keyuse_array, JOIN_TAB *stat, COND *cond, table_map usable_tables) |
| static void | add_key_fields_for_nj (TABLE_LIST *nested_join_table, KEY_FIELD **end, uint *and_level) |
| static void | calc_used_field_length (THD *thd, JOIN_TAB *join_tab) |
| bool | store_val_in_field (Field *field, Item *item, enum_check_fields check_flag) |
| void | add_cond_and_fix (Item **e1, Item *e2) |
| static void | add_not_null_conds (JOIN *join) |
| static COND * | add_found_match_trig_cond (JOIN_TAB *tab, COND *cond, JOIN_TAB *root_tab) |
| bool | error_if_full_join (JOIN *join) |
| static bool | eq_ref_table (JOIN *join, ORDER *start_order, JOIN_TAB *tab) |
| static void | clear_tables (JOIN *join) |
| Item_equal * | find_item_equal (COND_EQUAL *cond_equal, Field *field, bool *inherited_fl) |
| static bool | check_equality (Item *item, COND_EQUAL *cond_equal) |
| static COND * | build_equal_items_for_cond (COND *cond, COND_EQUAL *inherited) |
| static int | compare_fields_by_table_order (Item_field *field1, Item_field *field2, void *table_join_idx) |
| static Item * | eliminate_item_equal (COND *cond, COND_EQUAL *upper_levels, Item_equal *item_equal) |
| static void | update_const_equal_items (COND *cond, JOIN_TAB *tab) |
| static void | change_cond_ref_to_const (THD *thd, I_List< COND_CMP > *save_list, Item *and_father, Item *cond, Item *field, Item *value) |
| static void | propagate_cond_constants (THD *thd, I_List< COND_CMP > *save_list, COND *and_father, COND *cond) |
| COND * | remove_eq_conds (THD *thd, COND *cond, Item::cond_result *cond_value) |
| Field * | create_tmp_field_from_field (THD *thd, Field *org_field, const char *name, TABLE *table, Item_field *item, uint convert_blob_length) |
| static Field * | create_tmp_field_from_item (THD *thd, Item *item, TABLE *table, Item ***copy_func, bool modify_item, uint convert_blob_length) |
| Field * | create_tmp_field_for_schema (THD *thd, Item *item, TABLE *table) |
| Field * | create_tmp_field (THD *thd, TABLE *table, Item *item, Item::Type type, Item ***copy_func, Field **from_field, Field **default_field, bool group, bool modify_item, bool table_cant_handle_bit_fields, bool make_copy_field, uint convert_blob_length) |
| void | setup_tmp_table_column_bitmaps (TABLE *table, byte *bitmaps) |
| TABLE * | create_tmp_table (THD *thd, TMP_TABLE_PARAM *param, List< Item > &fields, ORDER *group, bool distinct, bool save_sum_fields, ulonglong select_options, ha_rows rows_limit, char *table_alias) |
| TABLE * | create_virtual_tmp_table (THD *thd, List< create_field > &field_list) |
| void | free_tmp_table (THD *thd, TABLE *entry) |
| bool | create_myisam_from_heap (THD *thd, TABLE *table, TMP_TABLE_PARAM *param, int error, bool ignore_last_dupp_key_error) |
| Next_select_func | setup_end_select_func (JOIN *join) |
| enum_nested_loop_state | sub_select_cache (JOIN *join, JOIN_TAB *join_tab, bool end_of_records) |
| enum_nested_loop_state | sub_select (JOIN *join, JOIN_TAB *join_tab, bool end_of_records) |
| int | report_error (TABLE *table, int error) |
| int | safe_index_read (JOIN_TAB *tab) |
| static int | join_no_more_records (READ_RECORD *info __attribute__((unused))) |
| static enum_nested_loop_state | end_send (JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), bool end_of_records) |
| static enum_nested_loop_state | end_send_group (JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), bool end_of_records) |
| static enum_nested_loop_state | end_write (JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), bool end_of_records) |
| static enum_nested_loop_state | end_update (JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), bool end_of_records) |
| static enum_nested_loop_state | end_unique_update (JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), bool end_of_records) |
| static enum_nested_loop_state | end_write_group (JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), bool end_of_records) |
| static bool | test_if_ref (Item_field *left_item, Item *right_item) |
| static int | test_if_order_by_key (ORDER *order, TABLE *table, uint idx, uint *used_key_parts) |
| bool | is_subkey (KEY_PART_INFO *key_part, KEY_PART_INFO *ref_key_part, KEY_PART_INFO *ref_key_part_end) |
| static uint | test_if_subkey (ORDER *order, TABLE *table, uint ref, uint ref_key_parts, const key_map *usable_keys) |
| static bool | compare_record (TABLE *table, Field **ptr) |
| static bool | copy_blobs (Field **ptr) |
| static void | free_blobs (Field **ptr) |
| SORT_FIELD * | make_unireg_sortorder (ORDER *order, uint *length) |
| bool | cp_buffer_from_ref (THD *thd, TABLE *table, TABLE_REF *ref) |
| static bool | find_order_in_list (THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, ORDER *order, List< Item > &fields, List< Item > &all_fields, bool is_group_field) |
| int | setup_order (THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, List< Item > &fields, List< Item > &all_fields, ORDER *order) |
| int | setup_group (THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, List< Item > &fields, List< Item > &all_fields, ORDER *order, bool *hidden_group_fields) |
| void | count_field_types (TMP_TABLE_PARAM *param, List< Item > &fields, bool reset_with_sum_func) |
| bool | setup_copy_fields (THD *thd, TMP_TABLE_PARAM *param, Item **ref_pointer_array, List< Item > &res_selected_fields, List< Item > &res_all_fields, uint elements, List< Item > &all_fields) |
| void | copy_fields (TMP_TABLE_PARAM *param) |
| static void | update_tmptable_sum_func (Item_sum **func_ptr, TABLE *tmp_table __attribute__((unused))) |
| void | copy_funcs (Item **func_ptr) |
| void | free_underlaid_joins (THD *thd, SELECT_LEX *select) |
| static bool | change_group_ref (THD *thd, Item_func *expr, ORDER *group_list, bool *changed) |
| bool | mysql_explain_union (THD *thd, SELECT_LEX_UNIT *unit, select_result *result) |
| static void | print_join (THD *thd, String *str, List< TABLE_LIST > *tables) |
Variables | |
| const char * | join_type_str [] |
| #define AVG_STRING_LENGTH_TO_PACK_ROWS 64 |
| #define FT_KEYPART (MAX_REF_PARTS+10) |
Definition at line 2982 of file sql_select.cc.
Referenced by add_ft_keys(), best_access_path(), and create_ref_for_key().
| #define KEY_OPTIMIZE_EXISTS 1 |
Definition at line 2450 of file sql_select.cc.
Referenced by add_key_field(), add_key_part(), and merge_key_fields().
| #define KEY_OPTIMIZE_REF_OR_NULL 2 |
Definition at line 2451 of file sql_select.cc.
Referenced by add_key_part(), best_access_path(), create_ref_for_key(), merge_key_fields(), and sort_keyuse().
| #define MIN_STRING_LENGTH_TO_PACK_ROWS 10 |
| #define RATIO_TO_PACK_ROWS 2 |
| #define STRING_TOTAL_LENGTH_TO_PACK_ROWS 128 |
| typedef struct key_field_t KEY_FIELD |
Definition at line 4992 of file sql_select.cc.
References Item::quick_fix_field().
Referenced by add_not_null_conds().
04993 { 04994 if (*e1) 04995 { 04996 Item *res; 04997 if ((res= new Item_cond_and(*e1, e2))) 04998 { 04999 *e1= res; 05000 res->quick_fix_field(); 05001 } 05002 } 05003 else 05004 *e1= e2; 05005 }
Here is the call graph for this function:

Here is the caller graph for this function:

| static COND* add_found_match_trig_cond | ( | JOIN_TAB * | tab, | |
| COND * | cond, | |||
| JOIN_TAB * | root_tab | |||
| ) | [static] |
Definition at line 5127 of file sql_select.cc.
References cond, DBUG_ASSERT, st_join_table::first_upper, st_join_table::found, Item::quick_fix_field(), and Item::update_used_tables().
05128 { 05129 COND *tmp; 05130 DBUG_ASSERT(cond != 0); 05131 if (tab == root_tab) 05132 return cond; 05133 if ((tmp= add_found_match_trig_cond(tab->first_upper, cond, root_tab))) 05134 tmp= new Item_func_trig_cond(tmp, &tab->found); 05135 if (tmp) 05136 { 05137 tmp->quick_fix_field(); 05138 tmp->update_used_tables(); 05139 } 05140 return tmp; 05141 }
Here is the call graph for this function:

| static void add_ft_keys | ( | DYNAMIC_ARRAY * | keyuse_array, | |
| JOIN_TAB * | stat, | |||
| COND * | cond, | |||
| table_map | usable_tables | |||
| ) | [static] |
Definition at line 2985 of file sql_select.cc.
References cond, Item_func::COND_AND_FUNC, Item::COND_ITEM, Item_func::const_item(), Item_func::FT_FUNC, FT_KEYPART, func, Item::FUNC_ITEM, Item_func::functype(), Item_func::GE_FUNC, Item_func::GT_FUNC, insert_dynamic(), keyuse_t::key, Item_func_match::key, Item_func::key_item(), keyuse_t::keypart, keyuse_t::keypart_map, Item_func::LE_FUNC, Item_func::LT_FUNC, st_table::map, NO_SUCH_KEY, NULL, keyuse_t::optimize, keyuse_t::table, Item_func_match::table, Item_func::type(), Item::used_tables(), keyuse_t::used_tables, keyuse_t::val, Item::val_real(), and VOID.
Referenced by update_ref_and_keys().
02987 { 02988 Item_func_match *cond_func=NULL; 02989 02990 if (!cond) 02991 return; 02992 02993 if (cond->type() == Item::FUNC_ITEM) 02994 { 02995 Item_func *func=(Item_func *)cond; 02996 Item_func::Functype functype= func->functype(); 02997 if (functype == Item_func::FT_FUNC) 02998 cond_func=(Item_func_match *)cond; 02999 else if (func->arg_count == 2) 03000 { 03001 Item_func *arg0=(Item_func *)(func->arguments()[0]), 03002 *arg1=(Item_func *)(func->arguments()[1]); 03003 if (arg1->const_item() && 03004 ((functype == Item_func::GE_FUNC && arg1->val_real() > 0) || 03005 (functype == Item_func::GT_FUNC && arg1->val_real() >=0)) && 03006 arg0->type() == Item::FUNC_ITEM && 03007 arg0->functype() == Item_func::FT_FUNC) 03008 cond_func=(Item_func_match *) arg0; 03009 else if (arg0->const_item() && 03010 ((functype == Item_func::LE_FUNC && arg0->val_real() > 0) || 03011 (functype == Item_func::LT_FUNC && arg0->val_real() >=0)) && 03012 arg1->type() == Item::FUNC_ITEM && 03013 arg1->functype() == Item_func::FT_FUNC) 03014 cond_func=(Item_func_match *) arg1; 03015 } 03016 } 03017 else if (cond->type() == Item::COND_ITEM) 03018 { 03019 List_iterator_fast<Item> li(*((Item_cond*) cond)->argument_list()); 03020 03021 if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC) 03022 { 03023 Item *item; 03024 while ((item=li++)) 03025 add_ft_keys(keyuse_array,stat,item,usable_tables); 03026 } 03027 } 03028 03029 if (!cond_func || cond_func->key == NO_SUCH_KEY || 03030 !(usable_tables & cond_func->table->map)) 03031 return; 03032 03033 KEYUSE keyuse; 03034 keyuse.table= cond_func->table; 03035 keyuse.val = cond_func; 03036 keyuse.key = cond_func->key; 03037 keyuse.keypart= FT_KEYPART; 03038 keyuse.used_tables=cond_func->key_item()->used_tables(); 03039 keyuse.optimize= 0; 03040 keyuse.keypart_map= 0; 03041 VOID(insert_dynamic(keyuse_array,(gptr) &keyuse)); 03042 }
Here is the call graph for this function:

Here is the caller graph for this function:


