diff --git a/Docs/manual.texi b/Docs/manual.texi index 2136cf9d232860ac9ea8db0239884b30602c9781..2a1ec59cafff3ed37eaca12a19fb213f85cf6fbd 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -50223,6 +50223,7 @@ each individual 4.0.x release. @menu +* News-4.0.5:: Changes in release 4.0.5 * News-4.0.4:: Changes in release 4.0.4 * News-4.0.3:: Changes in release 4.0.3 (26 Aug 2002: Beta) * News-4.0.2:: Changes in release 4.0.2 (01 Jul 2002) @@ -50230,7 +50231,15 @@ each individual 4.0.x release. * News-4.0.0:: Changes in release 4.0.0 (Oct 2001: Alpha) @end menu -@node News-4.0.4, News-4.0.3, News-4.0.x, News-4.0.x +@node News-4.0.5, News-4.0.4, News-4.0.x, News-4.0.x +@appendixsubsec Changes in release 4.0.5 +@itemize +@item +Give error if one has more than 2 ^ 32 rows in a MyISAM MERGE file and one +has not compiled MySQL with @code{-DBIG_TABLES}. +@end itemize + +@node News-4.0.4, News-4.0.3, News-4.0.5, News-4.0.x @appendixsubsec Changes in release 4.0.4 @itemize @bullet diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc index db83732bd5053e3d1c8dd066cbbe54b6f1758c3f..c35bf6574454fa4cdc767283f9b3a661449ac00c 100644 --- a/sql/ha_myisammrg.cc +++ b/sql/ha_myisammrg.cc @@ -53,15 +53,23 @@ int ha_myisammrg::open(const char *name, int mode, uint test_if_locked) info(HA_STATUS_NO_LOCK | HA_STATUS_VARIABLE | HA_STATUS_CONST); if (!(test_if_locked & HA_OPEN_WAIT_IF_LOCKED)) myrg_extra(file,HA_EXTRA_WAIT_LOCK,0); + if (table->reclength != mean_rec_length && mean_rec_length) { DBUG_PRINT("error",("reclength: %d mean_rec_length: %d", table->reclength, mean_rec_length)); - myrg_close(file); - file=0; - return my_errno=HA_ERR_WRONG_TABLE_DEF; + goto err; } +#if !defined(BIG_TABLES) || SIZEOF_OFF_T == 4 + /* Merge table has more than 2G rows */ + if (table->crashed) + goto err; +#endif return (0); +err: + myrg_close(file); + file=0; + return (my_errno= HA_ERR_WRONG_TABLE_DEF); } int ha_myisammrg::close(void) @@ -184,8 +192,17 @@ void ha_myisammrg::info(uint flag) { MYMERGE_INFO info; (void) myrg_status(file,&info,flag); - records = info.records; - deleted = info.deleted; + /* + The following fails if one has not compiled MySQL with -DBIG_TABLES + and one has more than 2^32 rows in the merge tables. + */ + records = (ha_rows) info.records; + deleted = (ha_rows) info.deleted; +#if !defined(BIG_TABLES) || SIZEOF_OFF_T == 4 + if ((info.records >= (ulonglong) 1 << 32) || + (info.deleted >= (ulonglong) 1 << 32)) + table->crashed=1; +#endif data_file_length=info.data_file_length; errkey = info.errkey; table->keys_in_use= set_bits(key_map, table->keys); diff --git a/sql/handler.h b/sql/handler.h index c580a3a158a6e30442b4414e6e041507d7f03b2b..6b0f6d35136c8c0e793e82f77b2edb678fcf5c5d 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -192,8 +192,8 @@ public: byte *dupp_ref; /* Pointer to dupp row */ uint ref_length; /* Length of ref (1-8) */ uint block_size; /* index block size */ - ulonglong records; /* Records i datafilen */ - ulonglong deleted; /* Deleted records */ + ha_rows records; /* Records i datafilen */ + ha_rows deleted; /* Deleted records */ ulonglong data_file_length; /* Length off data file */ ulonglong max_data_file_length; /* Length off data file */ ulonglong index_file_length;