mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-22851: Engine independent index statistics are incorrect for large tables on Windows
An oveflow was happening on windows because on Windows sizeof(ulong) is 4 bytes while it is 8 bytes on Linux. Switched avg_frequency and avg length for column statistics to ulonglong. Switched avg_frequency for index statistics to ulonglong.
This commit is contained in:
@ -2096,8 +2096,8 @@ int alloc_statistics_for_table(THD* thd, TABLE *table)
|
||||
sizeof(Index_statistics) * keys);
|
||||
|
||||
uint key_parts= table->s->ext_key_parts;
|
||||
ulong *idx_avg_frequency= (ulong*) alloc_root(&table->mem_root,
|
||||
sizeof(ulong) * key_parts);
|
||||
ulonglong *idx_avg_frequency= (ulonglong*) alloc_root(&table->mem_root,
|
||||
sizeof(ulonglong) * key_parts);
|
||||
|
||||
uint columns= 0;
|
||||
for (field_ptr= table->field; *field_ptr; field_ptr++)
|
||||
@ -2142,7 +2142,7 @@ int alloc_statistics_for_table(THD* thd, TABLE *table)
|
||||
}
|
||||
}
|
||||
|
||||
memset(idx_avg_frequency, 0, sizeof(ulong) * key_parts);
|
||||
memset(idx_avg_frequency, 0, sizeof(ulonglong) * key_parts);
|
||||
|
||||
KEY *key_info, *end;
|
||||
for (key_info= table->key_info, end= key_info + table->s->keys;
|
||||
@ -2258,14 +2258,14 @@ static int alloc_statistics_for_table_share(THD* thd, TABLE_SHARE *table_share)
|
||||
}
|
||||
|
||||
uint key_parts= table_share->ext_key_parts;
|
||||
ulong *idx_avg_frequency= table_stats->idx_avg_frequency;
|
||||
ulonglong *idx_avg_frequency= table_stats->idx_avg_frequency;
|
||||
if (!idx_avg_frequency)
|
||||
{
|
||||
idx_avg_frequency= (ulong*) alloc_root(&stats_cb->mem_root,
|
||||
sizeof(ulong) * key_parts);
|
||||
idx_avg_frequency= (ulonglong*) alloc_root(&stats_cb->mem_root,
|
||||
sizeof(ulonglong) * key_parts);
|
||||
if (idx_avg_frequency)
|
||||
{
|
||||
memset(idx_avg_frequency, 0, sizeof(ulong) * key_parts);
|
||||
memset(idx_avg_frequency, 0, sizeof(ulonglong) * key_parts);
|
||||
table_stats->idx_avg_frequency= idx_avg_frequency;
|
||||
for (key_info= table_share->key_info, end= key_info + keys;
|
||||
key_info < end;
|
||||
|
Reference in New Issue
Block a user