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:
@ -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;
|
||||
|
Reference in New Issue
Block a user