Commit f757e3f3 authored by Vicențiu Ciorbaru's avatar Vicențiu Ciorbaru

More work

parent 211e3022
...@@ -2745,10 +2745,12 @@ int collect_statistics_for_table(THD *thd, TABLE *table) ...@@ -2745,10 +2745,12 @@ int collect_statistics_for_table(THD *thd, TABLE *table)
rc= file->ha_random_sample_init(thd, 100); rc= file->ha_random_sample_init(thd, 100);
rc= file->ha_random_sample(table->record[0]); rc= file->ha_random_sample(table->record[0]);
table_field->collected_stats->add(0);
rc= file->ha_random_sample_end(); rc= file->ha_random_sample_end();
/* Perform a full table scan to collect statistics on 'table's columns */ /* Perform a full table scan to collect statistics on 'table's columns */
/*
if (!(rc= file->ha_rnd_init(TRUE))) if (!(rc= file->ha_rnd_init(TRUE)))
{ {
DEBUG_SYNC(table->in_use, "statistics_collection_start"); DEBUG_SYNC(table->in_use, "statistics_collection_start");
...@@ -2776,7 +2778,7 @@ int collect_statistics_for_table(THD *thd, TABLE *table) ...@@ -2776,7 +2778,7 @@ int collect_statistics_for_table(THD *thd, TABLE *table)
file->ha_rnd_end(); file->ha_rnd_end();
} }
rc= (rc == HA_ERR_END_OF_FILE && !thd->killed) ? 0 : 1; rc= (rc == HA_ERR_END_OF_FILE && !thd->killed) ? 0 : 1;
*/
/* /*
Calculate values for all statistical characteristics on columns and Calculate values for all statistical characteristics on columns and
and for each field f of 'table' save them in the write_stat structure and for each field f of 'table' save them in the write_stat structure
......
...@@ -291,6 +291,11 @@ static int _mi_read_sample_static_record(MI_INFO *info, uchar *buf) ...@@ -291,6 +291,11 @@ static int _mi_read_sample_static_record(MI_INFO *info, uchar *buf)
DBUG_ENTER("_mi_read_sample_static_record"); DBUG_ENTER("_mi_read_sample_static_record");
DBUG_ASSERT(info->s->read_rnd == _mi_read_rnd_static_record); DBUG_ASSERT(info->s->read_rnd == _mi_read_rnd_static_record);
if (fast_mi_readinfo(info))
DBUG_RETURN(-1);
fast_mi_writeinfo(info);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
...@@ -303,6 +308,7 @@ static int _mi_read_sample_bernoulli(MI_INFO *info, uchar *buf) ...@@ -303,6 +308,7 @@ static int _mi_read_sample_bernoulli(MI_INFO *info, uchar *buf)
if (fast_mi_readinfo(info)) if (fast_mi_readinfo(info))
DBUG_RETURN(-1); DBUG_RETURN(-1);
/* No rows to sample from. */
if (!info->state->records) if (!info->state->records)
DBUG_RETURN(HA_ERR_END_OF_FILE); DBUG_RETURN(HA_ERR_END_OF_FILE);
...@@ -310,20 +316,12 @@ static int _mi_read_sample_bernoulli(MI_INFO *info, uchar *buf) ...@@ -310,20 +316,12 @@ static int _mi_read_sample_bernoulli(MI_INFO *info, uchar *buf)
info->state->records; info->state->records;
do do
{ {
res= mi_scan(info, buf); if ((res= mi_scan(info, buf)))
/* Restart scan if we reached the end. */ break;
if (res == HA_ERR_END_OF_FILE)
{
if ((res= mi_scan_init(info)))
DBUG_RETURN(res);
/* Second failure, abort. */
if ((res= mi_scan(info, buf)))
DBUG_RETURN(res);
}
} while (my_rnd_ssl(&info->sampling_state.rand) < select_probability); } while (my_rnd_ssl(&info->sampling_state.rand) < select_probability);
fast_mi_writeinfo(info); fast_mi_writeinfo(info);
DBUG_RETURN(0); DBUG_RETURN(res);
} }
int mi_random_sample_init(MYSQL_THD thd, MI_INFO *info, int mi_random_sample_init(MYSQL_THD thd, MI_INFO *info,
...@@ -332,21 +330,26 @@ int mi_random_sample_init(MYSQL_THD thd, MI_INFO *info, ...@@ -332,21 +330,26 @@ int mi_random_sample_init(MYSQL_THD thd, MI_INFO *info,
int res= 0; int res= 0;
DBUG_ENTER("mi_random_sample_init"); DBUG_ENTER("mi_random_sample_init");
struct st_sampling_state *ss= &info->sampling_state; struct st_sampling_state *ss= &info->sampling_state;
ss->initialised= TRUE; ss->initialised= TRUE;
ss->estimate_rows_read= estimate_rows_read; ss->estimate_rows_read= estimate_rows_read;
/* TODO(cvicentiu) use thd_rnd service instead. */
ss->thd= thd; ss->thd= thd;
ss->rand.max_value= 1; ss->rand.max_value= 1;
my_rnd_init(&ss->rand, 42, 32); my_rnd_init(&ss->rand, 42, 32);
/* Fastest possible case, equal sized records. */ /* Fastest possible case, equal sized records. */
if (!(info->s->options & (HA_OPTION_COMPRESS_RECORD | HA_OPTION_PACK_RECORD))) if (!(info->s->options & (HA_OPTION_COMPRESS_RECORD | HA_OPTION_PACK_RECORD))
&& FALSE /* TODO(remove this once bernoulli is tested) */)
{ {
info->sampling_state.read_sample= _mi_read_sample_static_record; info->sampling_state.read_sample= _mi_read_sample_static_record;
} }
else
/* Fallback revert to simple scan. */ {
info->sampling_state.read_sample= _mi_read_sample_bernoulli; /* Fallback revert to simple scan. */
mi_scan_init(info); mi_scan_init(info);
info->sampling_state.read_sample= _mi_read_sample_bernoulli;
}
DBUG_RETURN(res); DBUG_RETURN(res);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment