diff options
author | Igor Babaev <igor@askmonty.org> | 2011-10-17 01:20:16 -0700 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2011-10-17 01:20:16 -0700 |
commit | bb916d0f09c290f0f75b4c34aaccb98f1f53ffef (patch) | |
tree | f552c421fb18a141f81cf99f459eb5181cb2f437 /sql | |
parent | d5959780aaa66b229df406e6343d0ef1b4d36750 (diff) | |
parent | f5955f87c6aed0af0ffbbab918e953b8c340d466 (diff) | |
download | mariadb-git-bb916d0f09c290f0f75b4c34aaccb98f1f53ffef.tar.gz |
Merge.
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_select.cc | 36 | ||||
-rw-r--r-- | sql/table.cc | 13 |
2 files changed, 33 insertions, 16 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 61981f87c0a..24778ef6a98 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -8413,17 +8413,17 @@ bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys) TABLE *table= keyuse->table; if (table->alloc_keys(keys)) return TRUE; - uint keyno= 0; + uint key_count= 0; KEYUSE *first_keyuse= keyuse; uint prev_part= keyuse->keypart; uint parts= 0; uint i= 0; - for ( ; i < count && keyno < keys; ) + for ( ; i < count && key_count < keys; ) { do { - keyuse->key= keyno; + keyuse->key= table->s->keys; keyuse->keypart_map= (key_part_map) (1 << parts); keyuse++; i++; @@ -8437,14 +8437,14 @@ bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys) } else { - if (table->add_tmp_key(keyno, parts, + if (table->add_tmp_key(table->s->keys, parts, get_next_field_for_derived_key, (uchar *) &first_keyuse, FALSE)) return TRUE; - table->reginfo.join_tab->keys.set_bit(keyno); + table->reginfo.join_tab->keys.set_bit(table->s->keys); first_keyuse= keyuse; - keyno++; + key_count++; parts= 0; prev_part= keyuse->keypart; } @@ -8471,12 +8471,23 @@ bool generate_derived_keys(DYNAMIC_ARRAY *keyuse_array) TABLE_LIST *derived= NULL; if (keyuse->table != prev_table) derived= keyuse->table->pos_in_table_list; - while (derived && derived->is_materialized_derived() && - keyuse->key == MAX_KEY) + while (derived && derived->is_materialized_derived()) { if (keyuse->table != prev_table) { prev_table= keyuse->table; + while (keyuse->table == prev_table && keyuse->key != MAX_KEY) + { + keyuse++; + i++; + } + if (keyuse->table != prev_table) + { + keyuse--; + i--; + derived= NULL; + continue; + } first_table_keyuse= keyuse; last_used_tables= keyuse->used_tables; count= 0; @@ -8489,11 +8500,13 @@ bool generate_derived_keys(DYNAMIC_ARRAY *keyuse_array) } count++; keyuse++; + i++; if (keyuse->table != prev_table) { if (generate_derived_keys_for_table(first_table_keyuse, count, ++keys)) return TRUE; keyuse--; + i--; derived= NULL; } } @@ -8524,12 +8537,13 @@ void JOIN::drop_unused_derived_keys() TABLE *table=tab->table; if (!table) continue; - if (!table->pos_in_table_list->is_materialized_derived() || - table->max_keys <= 1) + if (!table->pos_in_table_list->is_materialized_derived()) continue; - table->use_index(tab->ref.key); + if (table->max_keys > 1) + table->use_index(tab->ref.key); if (table->s->keys) tab->ref.key= 0; + tab->keys= (key_map) (table->s->keys ? 1 : 0); } } diff --git a/sql/table.cc b/sql/table.cc index d54135b5620..382de16b81c 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -5220,10 +5220,11 @@ void st_table::mark_virtual_columns_for_write(bool insert_fl) @brief Allocate space for keys - @param key_count number of keys to allocate + @param key_count number of keys to allocate additionally @details - The function allocates memory to fit 'key_count' keys for this table. + The function allocates memory to fit additionally 'key_count' keys + for this table. @return FALSE space was successfully allocated @return TRUE an error occur @@ -5231,9 +5232,11 @@ void st_table::mark_virtual_columns_for_write(bool insert_fl) bool TABLE::alloc_keys(uint key_count) { - key_info= s->key_info= (KEY*) alloc_root(&mem_root, sizeof(KEY)*key_count); - s->keys= 0; - max_keys= key_count; + key_info= (KEY*) alloc_root(&mem_root, sizeof(KEY)*(s->keys+key_count)); + if (s->keys) + memmove(key_info, s->key_info, sizeof(KEY)*s->keys); + s->key_info= key_info; + max_keys= s->keys+key_count; return !(key_info); } |