diff options
author | unknown <stewart@willster.(none)> | 2006-08-10 22:55:20 +0800 |
---|---|---|
committer | unknown <stewart@willster.(none)> | 2006-08-10 22:55:20 +0800 |
commit | e34496e5d827c774a92891fb8201a53a27564e38 (patch) | |
tree | eca32a4dab10c05bdc27fdb082459d63c173bbe4 /sql | |
parent | bfdbb780c26aae2705cf0d7e3048b5c0e40f59e1 (diff) | |
download | mariadb-git-e34496e5d827c774a92891fb8201a53a27564e38.tar.gz |
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)
sql/ha_berkeley.cc:
update handler::info interface to return int
sql/ha_berkeley.h:
update handler::info interface to return int
sql/ha_heap.cc:
update handler::info interface to return int
sql/ha_heap.h:
update handler::info interface to return int
sql/ha_innodb.cc:
update handler::info interface to return int
sql/ha_innodb.h:
update handler::info interface to return int
sql/ha_myisam.cc:
update handler::info interface to return int
sql/examples/ha_archive.cc:
update handler::info interface to return int
sql/examples/ha_archive.h:
update handler::info interface to return int
sql/examples/ha_example.cc:
update handler::info interface to return int
sql/examples/ha_example.h:
update handler::info interface to return int
sql/examples/ha_tina.cc:
update handler::info interface to return int
sql/examples/ha_tina.h:
update handler::info interface to return int
sql/ha_myisam.h:
update handler::info interface to return int
sql/ha_myisammrg.cc:
update handler::info interface to return int
sql/ha_myisammrg.h:
update handler::info interface to return int
sql/ha_ndbcluster.cc:
update handler::info interface to return int
sql/ha_ndbcluster.h:
update handler::info interface to return int
sql/handler.h:
update handler::info interface to return int
sql/opt_sum.cc:
If we get an error when using handler::info to get count(*),
print and return the error.
sql/sql_select.cc:
if error, set fatal error.
Diffstat (limited to 'sql')
-rw-r--r-- | sql/examples/ha_archive.cc | 4 | ||||
-rw-r--r-- | sql/examples/ha_archive.h | 2 | ||||
-rw-r--r-- | sql/examples/ha_example.cc | 4 | ||||
-rw-r--r-- | sql/examples/ha_example.h | 2 | ||||
-rw-r--r-- | sql/examples/ha_tina.cc | 4 | ||||
-rw-r--r-- | sql/examples/ha_tina.h | 2 | ||||
-rw-r--r-- | sql/ha_berkeley.cc | 4 | ||||
-rw-r--r-- | sql/ha_berkeley.h | 2 | ||||
-rw-r--r-- | sql/ha_heap.cc | 3 | ||||
-rw-r--r-- | sql/ha_heap.h | 2 | ||||
-rw-r--r-- | sql/ha_innodb.cc | 6 | ||||
-rw-r--r-- | sql/ha_innodb.h | 2 | ||||
-rw-r--r-- | sql/ha_myisam.cc | 4 | ||||
-rw-r--r-- | sql/ha_myisam.h | 2 | ||||
-rw-r--r-- | sql/ha_myisammrg.cc | 3 | ||||
-rw-r--r-- | sql/ha_myisammrg.h | 2 | ||||
-rw-r--r-- | sql/ha_ndbcluster.cc | 25 | ||||
-rw-r--r-- | sql/ha_ndbcluster.h | 4 | ||||
-rw-r--r-- | sql/handler.h | 2 | ||||
-rw-r--r-- | sql/opt_sum.cc | 7 | ||||
-rw-r--r-- | sql/sql_select.cc | 2 |
21 files changed, 53 insertions, 35 deletions
diff --git a/sql/examples/ha_archive.cc b/sql/examples/ha_archive.cc index 55fc359348f..16ba7605415 100644 --- a/sql/examples/ha_archive.cc +++ b/sql/examples/ha_archive.cc @@ -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) diff --git a/sql/examples/ha_archive.h b/sql/examples/ha_archive.h index 6ceb660e951..3c5dccfdb6f 100644 --- a/sql/examples/ha_archive.h +++ b/sql/examples/ha_archive.h @@ -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); diff --git a/sql/examples/ha_example.cc b/sql/examples/ha_example.cc index b3edce5ba4a..924ced816aa 100644 --- a/sql/examples/ha_example.cc +++ b/sql/examples/ha_example.cc @@ -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); } diff --git a/sql/examples/ha_example.h b/sql/examples/ha_example.h index ae72e5bb275..cb8a8465737 100644 --- a/sql/examples/ha_example.h +++ b/sql/examples/ha_example.h @@ -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); diff --git a/sql/examples/ha_tina.cc b/sql/examples/ha_tina.cc index 91e42bfea31..0091e1f40a0 100644 --- a/sql/examples/ha_tina.cc +++ b/sql/examples/ha_tina.cc @@ -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); } /* diff --git a/sql/examples/ha_tina.h b/sql/examples/ha_tina.h index 22193c01013..d8cd0fa9cfe 100644 --- a/sql/examples/ha_tina.h +++ b/sql/examples/ha_tina.h @@ -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); diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc index 33f7b6238b0..e8dbf7ab12d 100644 --- a/sql/ha_berkeley.cc +++ b/sql/ha_berkeley.cc @@ -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); } diff --git a/sql/ha_berkeley.h b/sql/ha_berkeley.h index 1d4823bbdc0..50d5d537663 100644 --- a/sql/ha_berkeley.h +++ b/sql/ha_berkeley.h @@ -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); diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index 9c680daaf91..3e981087df7 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -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) diff --git a/sql/ha_heap.h b/sql/ha_heap.h index 0a087fde1b0..3598a270efd 100644 --- a/sql/ha_heap.h +++ b/sql/ha_heap.h @@ -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); diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index 6c93ac293d0..3d1724efb91 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -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); } /************************************************************************** diff --git a/sql/ha_innodb.h b/sql/ha_innodb.h index d336811a1eb..bbe226fcb19 100644 --- a/sql/ha_innodb.h +++ b/sql/ha_innodb.h @@ -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); diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 9b84e48e970..2e29d929352 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -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; } diff --git a/sql/ha_myisam.h b/sql/ha_myisam.h index b256d4777f9..5bd1d263ad8 100644 --- a/sql/ha_myisam.h +++ b/sql/ha_myisam.h @@ -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); diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc index edb3521470f..62516d3dd41 100644 --- a/sql/ha_myisammrg.cc +++ b/sql/ha_myisammrg.cc @@ -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; } diff --git a/sql/ha_myisammrg.h b/sql/ha_myisammrg.h index 7348096b695..84eaae04590 100644 --- a/sql/ha_myisammrg.h +++ b/sql/ha_myisammrg.h @@ -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); diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 10240e597bf..0df680b7aa3 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -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); } diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h index 313e497f9b5..5e3811a5e8e 100644 --- a/sql/ha_ndbcluster.h +++ b/sql/ha_ndbcluster.h @@ -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 *); diff --git a/sql/handler.h b/sql/handler.h index e361dfd4559..75ff3c2764e 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -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) diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc index b53fbfd3f80..64b01ce002a 100644 --- a/sql/opt_sum.cc +++ b/sql/opt_sum.cc @@ -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; } } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 605ef49bb07..03ce04a81a7 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -537,6 +537,8 @@ JOIN::optimize() { if (res > 1) { + thd->fatal_error(); + error= res; DBUG_RETURN(1); } if (res < 0) |