summaryrefslogtreecommitdiff
path: root/sql/sql_statistics.cc
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2019-10-02 15:23:59 +0400
committerSergey Vojtovich <svoj@mariadb.org>2019-10-02 15:23:59 +0400
commite43791d4dc8feb2c02a08ce73c0bb0e2c320018c (patch)
tree09e69c24467f130df4b0973be7bf27f79c35c67c /sql/sql_statistics.cc
parent4bcf524482b3a4260347b0fe912fa2660af97c43 (diff)
downloadmariadb-git-e43791d4dc8feb2c02a08ce73c0bb0e2c320018c.tar.gz
Cleanup EITS
Moved EITS allocation inside read_statistics_for_tables_if_needed(). Removed redundant is_safe argument.
Diffstat (limited to 'sql/sql_statistics.cc')
-rw-r--r--sql/sql_statistics.cc53
1 files changed, 34 insertions, 19 deletions
diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc
index 52b3811e60d..e18cec589be 100644
--- a/sql/sql_statistics.cc
+++ b/sql/sql_statistics.cc
@@ -2216,8 +2216,6 @@ inline bool statistics_for_command_is_needed(THD *thd)
thd Thread handler
@param
table_share Table share for which the memory for statistical data is allocated
- @param
- is_safe TRUE <-> at any time only one thread can perform the function
@note
The function allocates the memory for the statistical data on a table in the
@@ -2226,8 +2224,6 @@ inline bool statistics_for_command_is_needed(THD *thd)
mysql.index_stats. The memory is allocated for the statistics on the table,
on the tables's columns, and on the table's indexes. The memory is allocated
in the table_share's mem_root.
- If the parameter is_safe is TRUE then it is guaranteed that at any given time
- only one thread is executed the code of the function.
@retval
0 If the memory for all statistical data has been successfully allocated
@@ -2246,16 +2242,10 @@ inline bool statistics_for_command_is_needed(THD *thd)
Here the second and the third threads try to allocate the memory for
statistical data at the same time. The precautions are taken to
guarantee the correctness of the allocation.
-
- @note
- Currently the function always is called with the parameter is_safe set
- to FALSE.
*/
-int alloc_statistics_for_table_share(THD* thd, TABLE_SHARE *table_share,
- bool is_safe)
+static int alloc_statistics_for_table_share(THD* thd, TABLE_SHARE *table_share)
{
-
Field **field_ptr;
KEY *key_info, *end;
TABLE_STATISTICS_CB *stats_cb= &table_share->stats_cb;
@@ -2268,13 +2258,11 @@ int alloc_statistics_for_table_share(THD* thd, TABLE_SHARE *table_share,
if (!statistics_for_command_is_needed(thd))
DBUG_RETURN(1);
- if (!is_safe)
- mysql_mutex_lock(&table_share->LOCK_share);
+ mysql_mutex_lock(&table_share->LOCK_share);
if (stats_cb->stats_can_be_read)
{
- if (!is_safe)
- mysql_mutex_unlock(&table_share->LOCK_share);
+ mysql_mutex_unlock(&table_share->LOCK_share);
DBUG_RETURN(0);
}
@@ -2285,8 +2273,7 @@ int alloc_statistics_for_table_share(THD* thd, TABLE_SHARE *table_share,
sizeof(Table_statistics));
if (!table_stats)
{
- if (!is_safe)
- mysql_mutex_unlock(&table_share->LOCK_share);
+ mysql_mutex_unlock(&table_share->LOCK_share);
DBUG_RETURN(1);
}
memset(table_stats, 0, sizeof(Table_statistics));
@@ -2358,8 +2345,7 @@ int alloc_statistics_for_table_share(THD* thd, TABLE_SHARE *table_share,
if (column_stats && index_stats && idx_avg_frequency)
stats_cb->stats_can_be_read= TRUE;
- if (!is_safe)
- mysql_mutex_unlock(&table_share->LOCK_share);
+ mysql_mutex_unlock(&table_share->LOCK_share);
DBUG_RETURN(0);
}
@@ -3264,6 +3250,35 @@ int read_statistics_for_tables_if_needed(THD *thd, TABLE_LIST *tables)
DBUG_ENTER("read_statistics_for_tables_if_needed");
+ for (TABLE_LIST *tl= tables; tl; tl= tl->next_global)
+ {
+ if (get_use_stat_tables_mode(thd) > NEVER && tl->table)
+ {
+ TABLE_SHARE *table_share= tl->table->s;
+ if (table_share && table_share->table_category == TABLE_CATEGORY_USER &&
+ table_share->tmp_table == NO_TMP_TABLE)
+ {
+ if (table_share->stats_cb.stats_can_be_read ||
+ !alloc_statistics_for_table_share(thd, table_share))
+ {
+ if (table_share->stats_cb.stats_can_be_read)
+ {
+ KEY *key_info= table_share->key_info;
+ KEY *key_info_end= key_info + table_share->keys;
+ KEY *table_key_info= tl->table->key_info;
+ for ( ; key_info < key_info_end; key_info++, table_key_info++)
+ table_key_info->read_stats= key_info->read_stats;
+ Field **field_ptr= table_share->field;
+ Field **table_field_ptr= tl->table->field;
+ for ( ; *field_ptr; field_ptr++, table_field_ptr++)
+ (*table_field_ptr)->read_stats= (*field_ptr)->read_stats;
+ tl->table->stats_is_read= table_share->stats_cb.stats_is_read;
+ }
+ }
+ }
+ }
+ }
+
DEBUG_SYNC(thd, "statistics_read_start");
if (!statistics_for_tables_is_needed(thd, tables))