1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

5.3 merge

This commit is contained in:
Sergei Golubchik
2014-09-12 16:51:41 +02:00
11 changed files with 560 additions and 11 deletions

View File

@ -9202,6 +9202,25 @@ uint get_next_field_for_derived_key(uchar *arg)
}
static
uint get_next_field_for_derived_key_simple(uchar *arg)
{
KEYUSE *keyuse= *(KEYUSE **) arg;
if (!keyuse)
return (uint) (-1);
TABLE *table= keyuse->table;
uint key= keyuse->key;
uint fldno= keyuse->keypart;
for ( ;
keyuse->table == table && keyuse->key == key && keyuse->keypart == fldno;
keyuse++)
;
if (keyuse->key != key)
keyuse= 0;
*((KEYUSE **) arg)= keyuse;
return fldno;
}
static
bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys)
{
@ -9232,12 +9251,28 @@ bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys)
}
else
{
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(table->s->keys);
KEYUSE *save_first_keyuse= first_keyuse;
if (table->check_tmp_key(table->s->keys, parts,
get_next_field_for_derived_key_simple,
(uchar *) &first_keyuse))
{
first_keyuse= save_first_keyuse;
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(table->s->keys);
}
else
{
/* Mark keyuses for this key to be excluded */
for (KEYUSE *curr=save_first_keyuse; curr < first_keyuse; curr++)
{
curr->key= MAX_KEY;
}
}
first_keyuse= keyuse;
key_count++;
parts= 0;