Commit bc91efe0 authored by stewart@mysql.com's avatar stewart@mysql.com

BUG#20725 MySQLD cluster use "fast count" is broken

Post recent handler changes, fast count(*) for cluster was broken.

Seeing as we maintain an exact count for ndb, we can easily use this for an optimisation.

With this patch, and use_exact_count DISABLED, we will use the fast way
of getting count(*) but not use the exact count for the optimiser.

With this patch and use_exact_count ENABLED, we will use the fast way of
getting count(*) and use the exact count for the optimiser.
parent 72e8a44d
...@@ -414,6 +414,30 @@ void ha_ndbcluster::set_rec_per_key() ...@@ -414,6 +414,30 @@ void ha_ndbcluster::set_rec_per_key()
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
ha_rows ha_ndbcluster::records()
{
ha_rows retval;
DBUG_ENTER("ha_ndbcluster::records");
struct Ndb_local_table_statistics *info= m_table_info;
DBUG_PRINT("info", ("id=%d, no_uncommitted_rows_count=%d",
((const NDBTAB *)m_table)->getTableId(),
info->no_uncommitted_rows_count));
Ndb *ndb= get_ndb();
ndb->setDatabaseName(m_dbname);
struct Ndb_statistics stat;
if (ndb_get_table_statistics(ndb, m_table, &stat) == 0)
{
retval= stat.row_count;
}
THD *thd= current_thd;
if (get_thd_ndb(thd)->error)
info->no_uncommitted_rows_count= 0;
DBUG_RETURN(retval + info->no_uncommitted_rows_count);
}
void ha_ndbcluster::records_update() void ha_ndbcluster::records_update()
{ {
if (m_ha_not_exact_count) if (m_ha_not_exact_count)
...@@ -5455,7 +5479,8 @@ void ha_ndbcluster::get_auto_increment(ulonglong offset, ulonglong increment, ...@@ -5455,7 +5479,8 @@ void ha_ndbcluster::get_auto_increment(ulonglong offset, ulonglong increment,
HA_PRIMARY_KEY_REQUIRED_FOR_POSITION | \ HA_PRIMARY_KEY_REQUIRED_FOR_POSITION | \
HA_PRIMARY_KEY_REQUIRED_FOR_DELETE | \ HA_PRIMARY_KEY_REQUIRED_FOR_DELETE | \
HA_PARTIAL_COLUMN_READ | \ HA_PARTIAL_COLUMN_READ | \
HA_HAS_OWN_BINLOGGING HA_HAS_OWN_BINLOGGING | \
HA_HAS_RECORDS
ha_ndbcluster::ha_ndbcluster(TABLE_SHARE *table_arg): ha_ndbcluster::ha_ndbcluster(TABLE_SHARE *table_arg):
handler(&ndbcluster_hton, table_arg), handler(&ndbcluster_hton, table_arg),
......
...@@ -622,6 +622,7 @@ class ha_ndbcluster: public handler ...@@ -622,6 +622,7 @@ class ha_ndbcluster: public handler
int read_multi_range_next(KEY_MULTI_RANGE **found_range_p); int read_multi_range_next(KEY_MULTI_RANGE **found_range_p);
bool get_error_message(int error, String *buf); bool get_error_message(int error, String *buf);
ha_rows records();
void info(uint); void info(uint);
void get_dynamic_partition_info(PARTITION_INFO *stat_info, uint part_id); void get_dynamic_partition_info(PARTITION_INFO *stat_info, uint part_id);
int extra(enum ha_extra_function operation); int extra(enum ha_extra_function operation);
......
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