mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
BUG#19914 SELECT COUNT(*) sometimes returns MAX_INT on cluster tables
allow handler::info to return an error code (that will be returned to the user)
This commit is contained in:
@ -972,7 +972,7 @@ int ha_archive::index_last(byte * buf)
|
||||
}
|
||||
|
||||
|
||||
void ha_archive::info(uint flag)
|
||||
int ha_archive::info(uint flag)
|
||||
{
|
||||
DBUG_ENTER("ha_archive::info");
|
||||
|
||||
@ -980,7 +980,7 @@ void ha_archive::info(uint flag)
|
||||
records= share->rows_recorded;
|
||||
deleted= 0;
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
int ha_archive::extra(enum ha_extra_function operation)
|
||||
|
@ -116,7 +116,7 @@ public:
|
||||
int read_data_header(gzFile file_to_read);
|
||||
int write_data_header(gzFile file_to_write);
|
||||
void position(const byte *record);
|
||||
void info(uint);
|
||||
int info(uint);
|
||||
int extra(enum ha_extra_function operation);
|
||||
int reset(void);
|
||||
int external_lock(THD *thd, int lock_type);
|
||||
|
@ -486,10 +486,10 @@ int ha_example::rnd_pos(byte * buf, byte *pos)
|
||||
sql_update.cc
|
||||
|
||||
*/
|
||||
void ha_example::info(uint flag)
|
||||
int ha_example::info(uint flag)
|
||||
{
|
||||
DBUG_ENTER("ha_example::info");
|
||||
DBUG_VOID_RETURN;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -138,7 +138,7 @@ public:
|
||||
int rnd_next(byte *buf); //required
|
||||
int rnd_pos(byte * buf, byte *pos); //required
|
||||
void position(const byte *record); //required
|
||||
void info(uint); //required
|
||||
int info(uint); //required
|
||||
|
||||
int extra(enum ha_extra_function operation);
|
||||
int reset(void);
|
||||
|
@ -683,13 +683,13 @@ int ha_tina::rnd_pos(byte * buf, byte *pos)
|
||||
Currently this table handler doesn't implement most of the fields
|
||||
really needed. SHOW also makes use of this data
|
||||
*/
|
||||
void ha_tina::info(uint flag)
|
||||
int ha_tina::info(uint flag)
|
||||
{
|
||||
DBUG_ENTER("ha_tina::info");
|
||||
/* This is a lie, but you don't want the optimizer to see zero or 1 */
|
||||
if (records < 2)
|
||||
records= 2;
|
||||
DBUG_VOID_RETURN;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -115,7 +115,7 @@ class ha_tina: public handler
|
||||
int rnd_pos(byte * buf, byte *pos);
|
||||
int rnd_end();
|
||||
void position(const byte *record);
|
||||
void info(uint);
|
||||
int info(uint);
|
||||
int extra(enum ha_extra_function operation);
|
||||
int reset(void);
|
||||
int external_lock(THD *thd, int lock_type);
|
||||
|
@ -1715,7 +1715,7 @@ void ha_berkeley::position(const byte *record)
|
||||
}
|
||||
|
||||
|
||||
void ha_berkeley::info(uint flag)
|
||||
int ha_berkeley::info(uint flag)
|
||||
{
|
||||
DBUG_ENTER("ha_berkeley::info");
|
||||
if (flag & HA_STATUS_VARIABLE)
|
||||
@ -1735,7 +1735,7 @@ void ha_berkeley::info(uint flag)
|
||||
/* Don't return key if we got an error for the internal primary key */
|
||||
if (flag & HA_STATUS_ERRKEY && last_dup_key < table->keys)
|
||||
errkey= last_dup_key;
|
||||
DBUG_VOID_RETURN;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -127,7 +127,7 @@ class ha_berkeley: public handler
|
||||
int rnd_next(byte *buf);
|
||||
int rnd_pos(byte * buf, byte *pos);
|
||||
void position(const byte *record);
|
||||
void info(uint);
|
||||
int info(uint);
|
||||
int extra(enum ha_extra_function operation);
|
||||
int reset(void);
|
||||
int external_lock(THD *thd, int lock_type);
|
||||
|
@ -282,7 +282,7 @@ void ha_heap::position(const byte *record)
|
||||
*(HEAP_PTR*) ref= heap_position(file); // Ref is aligned
|
||||
}
|
||||
|
||||
void ha_heap::info(uint flag)
|
||||
int ha_heap::info(uint flag)
|
||||
{
|
||||
HEAPINFO info;
|
||||
(void) heap_info(file,&info,flag);
|
||||
@ -304,6 +304,7 @@ void ha_heap::info(uint flag)
|
||||
*/
|
||||
if (key_stat_version != file->s->key_stat_version)
|
||||
update_key_stats();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ha_heap::extra(enum ha_extra_function operation)
|
||||
|
@ -80,7 +80,7 @@ public:
|
||||
int rnd_next(byte *buf);
|
||||
int rnd_pos(byte * buf, byte *pos);
|
||||
void position(const byte *record);
|
||||
void info(uint);
|
||||
int info(uint);
|
||||
int extra(enum ha_extra_function operation);
|
||||
int external_lock(THD *thd, int lock_type);
|
||||
int delete_all_rows(void);
|
||||
|
@ -4570,7 +4570,7 @@ ha_innobase::read_time(
|
||||
Returns statistics information of the table to the MySQL interpreter,
|
||||
in various fields of the handle object. */
|
||||
|
||||
void
|
||||
int
|
||||
ha_innobase::info(
|
||||
/*==============*/
|
||||
uint flag) /* in: what information MySQL requests */
|
||||
@ -4593,7 +4593,7 @@ ha_innobase::info(
|
||||
|
||||
if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE) {
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
DBUG_RETURN(HA_ERR_CRASHED);
|
||||
}
|
||||
|
||||
/* We do not know if MySQL can call this function before calling
|
||||
@ -4758,7 +4758,7 @@ ha_innobase::info(
|
||||
|
||||
prebuilt->trx->op_info = (char*)"";
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
@ -142,7 +142,7 @@ class ha_innobase: public handler
|
||||
int rnd_pos(byte * buf, byte *pos);
|
||||
|
||||
void position(const byte *record);
|
||||
void info(uint);
|
||||
int info(uint);
|
||||
int analyze(THD* thd,HA_CHECK_OPT* check_opt);
|
||||
int optimize(THD* thd,HA_CHECK_OPT* check_opt);
|
||||
int discard_or_import_tablespace(my_bool discard);
|
||||
|
@ -1214,7 +1214,7 @@ void ha_myisam::position(const byte* record)
|
||||
ha_store_ptr(ref, ref_length, position);
|
||||
}
|
||||
|
||||
void ha_myisam::info(uint flag)
|
||||
int ha_myisam::info(uint flag)
|
||||
{
|
||||
MI_ISAMINFO info;
|
||||
char name_buff[FN_REFLEN];
|
||||
@ -1273,6 +1273,8 @@ void ha_myisam::info(uint flag)
|
||||
update_time = info.update_time;
|
||||
if (flag & HA_STATUS_AUTO)
|
||||
auto_increment_value= info.auto_increment;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -100,7 +100,7 @@ class ha_myisam: public handler
|
||||
int rnd_pos(byte * buf, byte *pos);
|
||||
int restart_rnd_next(byte *buf, byte *pos);
|
||||
void position(const byte *record);
|
||||
void info(uint);
|
||||
int info(uint);
|
||||
int extra(enum ha_extra_function operation);
|
||||
int extra_opt(enum ha_extra_function operation, ulong cache_size);
|
||||
int external_lock(THD *thd, int lock_type);
|
||||
|
@ -218,7 +218,7 @@ ha_rows ha_myisammrg::records_in_range(uint inx, key_range *min_key,
|
||||
}
|
||||
|
||||
|
||||
void ha_myisammrg::info(uint flag)
|
||||
int ha_myisammrg::info(uint flag)
|
||||
{
|
||||
MYMERGE_INFO info;
|
||||
(void) myrg_status(file,&info,flag);
|
||||
@ -253,6 +253,7 @@ void ha_myisammrg::info(uint flag)
|
||||
(char*) info.rec_per_key,
|
||||
sizeof(table->key_info[0].rec_per_key)*table->key_parts);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -71,7 +71,7 @@ class ha_myisammrg: public handler
|
||||
int rnd_pos(byte * buf, byte *pos);
|
||||
void position(const byte *record);
|
||||
ha_rows records_in_range(uint inx, key_range *min_key, key_range *max_key);
|
||||
void info(uint);
|
||||
int info(uint);
|
||||
int extra(enum ha_extra_function operation);
|
||||
int extra_opt(enum ha_extra_function operation, ulong cache_size);
|
||||
int external_lock(THD *thd, int lock_type);
|
||||
|
@ -256,11 +256,13 @@ void ha_ndbcluster::set_rec_per_key()
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
void ha_ndbcluster::records_update()
|
||||
int ha_ndbcluster::records_update()
|
||||
{
|
||||
if (m_ha_not_exact_count)
|
||||
return;
|
||||
return 0;
|
||||
DBUG_ENTER("ha_ndbcluster::records_update");
|
||||
int result= 0;
|
||||
|
||||
struct Ndb_local_table_statistics *info=
|
||||
(struct Ndb_local_table_statistics *)m_table_info;
|
||||
DBUG_PRINT("info", ("id=%d, no_uncommitted_rows_count=%d",
|
||||
@ -271,7 +273,7 @@ void ha_ndbcluster::records_update()
|
||||
Ndb *ndb= get_ndb();
|
||||
Uint64 rows;
|
||||
ndb->setDatabaseName(m_dbname);
|
||||
if(ndb_get_table_statistics(ndb, m_tabname, &rows, 0) == 0){
|
||||
if((result= ndb_get_table_statistics(ndb, m_tabname, &rows, 0)) == 0){
|
||||
info->records= rows;
|
||||
}
|
||||
}
|
||||
@ -281,7 +283,7 @@ void ha_ndbcluster::records_update()
|
||||
info->no_uncommitted_rows_count= 0;
|
||||
}
|
||||
records= info->records+ info->no_uncommitted_rows_count;
|
||||
DBUG_VOID_RETURN;
|
||||
DBUG_RETURN(result);
|
||||
}
|
||||
|
||||
void ha_ndbcluster::no_uncommitted_rows_execute_failure()
|
||||
@ -2858,8 +2860,9 @@ void ha_ndbcluster::position(const byte *record)
|
||||
}
|
||||
|
||||
|
||||
void ha_ndbcluster::info(uint flag)
|
||||
int ha_ndbcluster::info(uint flag)
|
||||
{
|
||||
int result= 0;
|
||||
DBUG_ENTER("info");
|
||||
DBUG_PRINT("enter", ("flag: %d", flag));
|
||||
|
||||
@ -2877,17 +2880,17 @@ void ha_ndbcluster::info(uint flag)
|
||||
if (m_ha_not_exact_count)
|
||||
records= 100;
|
||||
else
|
||||
records_update();
|
||||
result= records_update();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((my_errno= check_ndb_connection()))
|
||||
DBUG_VOID_RETURN;
|
||||
DBUG_RETURN(my_errno);
|
||||
Ndb *ndb= get_ndb();
|
||||
Uint64 rows= 100;
|
||||
ndb->setDatabaseName(m_dbname);
|
||||
if (current_thd->variables.ndb_use_exact_count)
|
||||
ndb_get_table_statistics(ndb, m_tabname, &rows, 0);
|
||||
result= ndb_get_table_statistics(ndb, m_tabname, &rows, 0);
|
||||
records= rows;
|
||||
}
|
||||
}
|
||||
@ -2912,7 +2915,11 @@ void ha_ndbcluster::info(uint flag)
|
||||
ndb->readAutoIncrementValue((const NDBTAB *) m_table);
|
||||
}
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
|
||||
if(result == -1)
|
||||
result= HA_ERR_NO_CONNECTION;
|
||||
|
||||
DBUG_RETURN(result);
|
||||
}
|
||||
|
||||
|
||||
|
@ -115,7 +115,7 @@ class ha_ndbcluster: public handler
|
||||
int read_range_next();
|
||||
|
||||
bool get_error_message(int error, String *buf);
|
||||
void info(uint);
|
||||
int info(uint);
|
||||
int extra(enum ha_extra_function operation);
|
||||
int extra_opt(enum ha_extra_function operation, ulong cache_size);
|
||||
int reset();
|
||||
@ -256,7 +256,7 @@ class ha_ndbcluster: public handler
|
||||
|
||||
Ndb *get_ndb();
|
||||
void set_rec_per_key();
|
||||
void records_update();
|
||||
int records_update();
|
||||
void no_uncommitted_rows_execute_failure();
|
||||
void no_uncommitted_rows_update(int);
|
||||
void no_uncommitted_rows_init(THD *);
|
||||
|
@ -394,7 +394,7 @@ public:
|
||||
key_range *max_key)
|
||||
{ return (ha_rows) 10; }
|
||||
virtual void position(const byte *record)=0;
|
||||
virtual void info(uint)=0;
|
||||
virtual int info(uint)=0;
|
||||
virtual int extra(enum ha_extra_function operation)
|
||||
{ return 0; }
|
||||
virtual int extra_opt(enum ha_extra_function operation, ulong cache_size)
|
||||
|
@ -125,7 +125,12 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
||||
}
|
||||
else
|
||||
{
|
||||
tl->table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
|
||||
error= tl->table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
|
||||
if(error)
|
||||
{
|
||||
tl->table->file->print_error(error, MYF(0));
|
||||
return error;
|
||||
}
|
||||
count*= tl->table->file->records;
|
||||
}
|
||||
}
|
||||
|
@ -537,6 +537,8 @@ JOIN::optimize()
|
||||
{
|
||||
if (res > 1)
|
||||
{
|
||||
thd->fatal_error();
|
||||
error= res;
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
if (res < 0)
|
||||
|
Reference in New Issue
Block a user