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;