mirror of
https://github.com/MariaDB/server.git
synced 2026-05-15 19:37:16 +02:00
BUG#9622, stage 2, work together with fix for BUG#12232:
added "nulls_ignored" index statistics collection method for MyISAM tables. (notification trigger: this is about BUG#9622). include/my_base.h: BUG#9622: Added MI_STATS_METHOD_IGNORE_NULLS statistics collection method: Added SEARCH_RETURN_B_POS flag for ha_key_cmp() include/my_handler.h: BUG#9622: Added MI_STATS_METHOD_IGNORE_NULLS statistics collection method: added ha_find_null() include/myisam.h: BUG#9622: Added MI_STATS_METHOD_IGNORE_NULLS statistics collection method. myisam/mi_check.c: BUG#9622: Added MI_STATS_METHOD_IGNORE_NULLS statistics collection method, added mi_collect_stats_*(), updated update_key_parts() to deal with all 3 methods. myisam/myisamchk.c: BUG#9622: Added nulls_ignored index statistics collection method for MyISAM myisam/myisamdef.h: BUG#9622: Added MI_STATS_METHOD_IGNORE_NULLS statistics collection method. myisam/sort.c: BUG#9622: Added MI_STATS_METHOD_IGNORE_NULLS statistics collection method. mysql-test/r/myisam.result: Testcase for BUG9622 mysql-test/t/myisam.test: Testcase for BUG9622 mysys/my_handler.c: BUG#9622: ha_key_cmp() now supports new SEARCH_RETURN_B_POS flag, added ha_find_null() sql/ha_myisam.cc: BUG#9622: Added MI_STATS_METHOD_IGNORE_NULLS statistics collection method. sql/mysqld.cc: BUG#9622: Added MI_STATS_METHOD_IGNORE_NULLS statistics collection method.
This commit is contained in:
parent
0c16a7ccc7
commit
71fdef4d10
12 changed files with 375 additions and 31 deletions
|
|
@ -75,7 +75,7 @@ static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length,
|
|||
|
||||
SYNOPSIS
|
||||
ha_key_cmp()
|
||||
keyseg Key segments of key to compare
|
||||
keyseg Array of key segments of key to compare
|
||||
a First key to compare, in format from _mi_pack_key()
|
||||
This is normally key specified by user
|
||||
b Second key to compare. This is always from a row
|
||||
|
|
@ -84,10 +84,20 @@ static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length,
|
|||
next_flag How keys should be compared
|
||||
If bit SEARCH_FIND is not set the keys includes the row
|
||||
position and this should also be compared
|
||||
|
||||
diff_pos OUT Number of first keypart where values differ, counting
|
||||
from one.
|
||||
|
||||
NOTES
|
||||
Number-keys can't be splited
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
If SEARCH_RETURN_B_POS flag is set, diff_pos must point to array of 2
|
||||
values, first value has the meaning as described above, second value is:
|
||||
|
||||
diff_pos[1] OUT (b + diff_pos[1]) points to first value in tuple b
|
||||
that is different from corresponding value in tuple a.
|
||||
|
||||
RETURN VALUES
|
||||
<0 If a < b
|
||||
0 If a == b
|
||||
|
|
@ -107,6 +117,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a,
|
|||
float f_1,f_2;
|
||||
double d_1,d_2;
|
||||
uint next_key_length;
|
||||
uchar *orig_b= b;
|
||||
|
||||
*diff_pos=0;
|
||||
for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++)
|
||||
|
|
@ -115,6 +126,9 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a,
|
|||
uint piks=! (keyseg->flag & HA_NO_SORT);
|
||||
(*diff_pos)++;
|
||||
|
||||
if (nextflag & SEARCH_RETURN_B_POS)
|
||||
diff_pos[1]= (uint)(b - orig_b);
|
||||
|
||||
/* Handle NULL part */
|
||||
if (keyseg->null_bit)
|
||||
{
|
||||
|
|
@ -448,3 +462,84 @@ end:
|
|||
}
|
||||
return 0;
|
||||
} /* ha_key_cmp */
|
||||
|
||||
|
||||
/*
|
||||
Find the first NULL value in index-suffix values tuple
|
||||
|
||||
SYNOPSIS
|
||||
ha_find_null()
|
||||
keyseg Array of keyparts for key suffix
|
||||
a Key suffix value tuple
|
||||
|
||||
DESCRIPTION
|
||||
Find the first NULL value in index-suffix values tuple.
|
||||
TODO Consider optimizing this fuction or its use so we don't search for
|
||||
NULL values in completely NOT NULL index suffixes.
|
||||
|
||||
RETURN
|
||||
First key part that has NULL as value in values tuple, or the last key part
|
||||
(with keyseg->type==HA_TYPE_END) if values tuple doesn't contain NULLs.
|
||||
*/
|
||||
|
||||
HA_KEYSEG *ha_find_null(HA_KEYSEG *keyseg, uchar *a)
|
||||
{
|
||||
for (; (enum ha_base_keytype) keyseg->type != HA_KEYTYPE_END; keyseg++)
|
||||
{
|
||||
uchar *end;
|
||||
if (keyseg->null_bit)
|
||||
{
|
||||
if (!*a++)
|
||||
return keyseg;
|
||||
}
|
||||
end= a+ keyseg->length;
|
||||
|
||||
switch ((enum ha_base_keytype) keyseg->type) {
|
||||
case HA_KEYTYPE_TEXT:
|
||||
case HA_KEYTYPE_BINARY:
|
||||
if (keyseg->flag & HA_SPACE_PACK)
|
||||
{
|
||||
int a_length;
|
||||
get_key_length(a_length, a);
|
||||
a += a_length;
|
||||
break;
|
||||
}
|
||||
else
|
||||
a= end;
|
||||
break;
|
||||
case HA_KEYTYPE_VARTEXT:
|
||||
case HA_KEYTYPE_VARBINARY:
|
||||
{
|
||||
int a_length;
|
||||
get_key_length(a_length, a);
|
||||
a+= a_length;
|
||||
break;
|
||||
}
|
||||
case HA_KEYTYPE_NUM:
|
||||
if (keyseg->flag & HA_SPACE_PACK)
|
||||
{
|
||||
int alength= *a++;
|
||||
end= a+alength;
|
||||
}
|
||||
a= end;
|
||||
break;
|
||||
case HA_KEYTYPE_INT8:
|
||||
case HA_KEYTYPE_SHORT_INT:
|
||||
case HA_KEYTYPE_USHORT_INT:
|
||||
case HA_KEYTYPE_LONG_INT:
|
||||
case HA_KEYTYPE_ULONG_INT:
|
||||
case HA_KEYTYPE_INT24:
|
||||
case HA_KEYTYPE_UINT24:
|
||||
#ifdef HAVE_LONG_LONG
|
||||
case HA_KEYTYPE_LONGLONG:
|
||||
case HA_KEYTYPE_ULONGLONG:
|
||||
#endif
|
||||
case HA_KEYTYPE_FLOAT:
|
||||
case HA_KEYTYPE_DOUBLE:
|
||||
a= end;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return keyseg;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue