From 422d6b357f90d404f58bdd4444c048a760f0d9f8 Mon Sep 17 00:00:00 2001
From: unknown <istruewing@chilla.local>
Date: Fri, 5 Jan 2007 10:26:51 +0100
Subject: [PATCH] Bug#24607 - MyISAM pointer size determined incorrectly

The function mi_get_pointer_length() computed too small
pointer size for very large tables.

Inserted missing 'else' between the branches for very
large tables.


myisam/mi_create.c:
  Bug#24607 - MyISAM pointer size determined incorrectly
  Inserted missing 'else' between the branches for very
  large tables.
  Harmonized literals "(longlong) 1" and "1L" to "ULL(1)"
  where they are used for "ulonglong file_length".
mysql-test/r/myisam.result:
  Bug#24607 - MyISAM pointer size determined incorrectly
  Added the test result.
mysql-test/t/myisam.test:
  Bug#24607 - MyISAM pointer size determined incorrectly
  Added the test.
---
 myisam/mi_create.c         | 13 +++++++------
 mysql-test/r/myisam.result |  5 +++++
 mysql-test/t/myisam.test   |  8 ++++++++
 3 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/myisam/mi_create.c b/myisam/mi_create.c
index c1310a8012..da9e0887b0 100644
--- a/myisam/mi_create.c
+++ b/myisam/mi_create.c
@@ -768,18 +768,19 @@ uint mi_get_pointer_length(ulonglong file_length, uint def)
   if (file_length)				/* If not default */
   {
 #ifdef NOT_YET_READY_FOR_8_BYTE_POINTERS
-    if (file_length >= (longlong) 1 << 56)
+    if (file_length >= ULL(1) << 56)
       def=8;
+    else
 #endif
-    if (file_length >= (longlong) 1 << 48)
+    if (file_length >= ULL(1) << 48)
       def=7;
-    if (file_length >= (longlong) 1 << 40)
+    else if (file_length >= ULL(1) << 40)
       def=6;
-    else if (file_length >= (longlong) 1 << 32)
+    else if (file_length >= ULL(1) << 32)
       def=5;
-    else if (file_length >= (1L << 24))
+    else if (file_length >= ULL(1) << 24)
       def=4;
-    else if (file_length >= (1L << 16))
+    else if (file_length >= ULL(1) << 16)
       def=3;
     else
       def=2;
diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result
index 73cee4835b..749d5f4780 100644
--- a/mysql-test/r/myisam.result
+++ b/mysql-test/r/myisam.result
@@ -960,3 +960,8 @@ a
 2
 3
 DROP TABLE t1;
+CREATE TABLE t1 (c1 TEXT) AVG_ROW_LENGTH=70100 MAX_ROWS=5100100100;
+SHOW TABLE STATUS LIKE 't1';
+Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
+t1	MyISAM	9	Dynamic	X	X	X	72057594037927935	X	X	X	X	X	X	latin1_swedish_ci	X	max_rows=4294967295 avg_row_length=70100	
+DROP TABLE t1;
diff --git a/mysql-test/t/myisam.test b/mysql-test/t/myisam.test
index 7868e7bad4..d065d2e3eb 100644
--- a/mysql-test/t/myisam.test
+++ b/mysql-test/t/myisam.test
@@ -909,4 +909,12 @@ UPDATE t1,t1 AS t2 SET t1.a=t1.a+2 WHERE t1.a=t2.a-1;
 SELECT * FROM t1 ORDER BY a;
 DROP TABLE t1;
 
+#
+# Bug#24607 - MyISAM pointer size determined incorrectly
+#
+CREATE TABLE t1 (c1 TEXT) AVG_ROW_LENGTH=70100 MAX_ROWS=5100100100;
+--replace_column 5 X 6 X 7 X 9 X 10 X 11 X 12 X 13 X 14 X 16 X
+SHOW TABLE STATUS LIKE 't1';
+DROP TABLE t1;
+
 # End of 4.1 tests
-- 
2.30.9