List:Commits« Previous MessageNext Message »
From:ingo Date:January 19 2007 12:08pm
Subject:bk commit into 5.1 tree (istruewing:1.2378)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of istruewing. When istruewing does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-01-19 13:08:09+01:00, istruewing@stripped +3 -0
  Merge chilla.local:/home/mydev/mysql-5.0-bug24607
  into  chilla.local:/home/mydev/mysql-5.1-bug24607
  MERGE: 1.1810.2362.37

  mysql-test/r/myisam.result@stripped, 2007-01-19 13:08:06+01:00, istruewing@stripped +0 -0
    SCCS merged
    MERGE: 1.71.1.22

  mysql-test/t/myisam.test@stripped, 2007-01-19 13:08:06+01:00, istruewing@stripped +0 -0
    SCCS merged
    MERGE: 1.55.7.2

  storage/myisam/mi_create.c@stripped, 2007-01-19 13:07:07+01:00, istruewing@stripped +0 -0
    Auto merged
    MERGE: 1.45.17.2

  storage/myisam/mi_create.c@stripped, 2007-01-19 13:07:07+01:00, istruewing@stripped +0 -0
    Merge rename: myisam/mi_create.c -> storage/myisam/mi_create.c

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	istruewing
# Host:	chilla.local
# Root:	/home/mydev/mysql-5.1-bug24607/RESYNC

--- 1.45.17.1/myisam/mi_create.c	2007-01-19 13:08:16 +01:00
+++ 1.66/storage/myisam/mi_create.c	2007-01-19 13:08:16 +01:00
@@ -27,9 +27,9 @@
 #endif
 #include <m_ctype.h>
 
-	/*
-	** Old options is used when recreating database, from isamchk
-	*/
+/*
+  Old options is used when recreating database, from myisamchk
+*/
 
 int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
 	      uint columns, MI_COLUMNDEF *recinfo,
@@ -44,6 +44,7 @@ int mi_create(const char *name,uint keys
        key_length,info_length,key_segs,options,min_key_length_skip,
        base_pos,long_varchar_count,varchar_length,
        max_key_block_length,unique_key_parts,fulltext_keys,offset;
+  uint aligned_key_start, block_length;
   ulong reclength, real_reclength,min_pack_length;
   char filename[FN_REFLEN],linkname[FN_REFLEN], *linkname_ptr;
   ulong pack_reclength;
@@ -184,6 +185,8 @@ int mi_create(const char *name,uint keys
   }
   if (flags & HA_CREATE_DELAY_KEY_WRITE)
     options|= HA_OPTION_DELAY_KEY_WRITE;
+  if (flags & HA_CREATE_RELIES_ON_SQL_LAYER)
+    options|= HA_OPTION_RELIES_ON_SQL_LAYER;
 
   packed=(packed+7)/8;
   if (pack_reclength != INT_MAX32)
@@ -427,8 +430,16 @@ int mi_create(const char *name,uint keys
 	key_segs)
       share.state.rec_per_key_part[key_segs-1]=1L;
     length+=key_length;
+    /* Get block length for key, if defined by user */
+    block_length= (keydef->block_length ? 
+                   my_round_up_to_next_power(keydef->block_length) :
+                   myisam_block_size);
+    block_length= max(block_length, MI_MIN_KEY_BLOCK_LENGTH);
+    block_length= min(block_length, MI_MAX_KEY_BLOCK_LENGTH);
+
     keydef->block_length= (uint16) MI_BLOCK_SIZE(length-real_length_diff,
-                                                 pointer,MI_MAX_KEYPTR_SIZE);
+                                                 pointer,MI_MAX_KEYPTR_SIZE,
+                                                 block_length);
     if (keydef->block_length > MI_MAX_KEY_BLOCK_LENGTH ||
         length >= MI_MAX_KEY_BUFF)
     {
@@ -494,7 +505,7 @@ int mi_create(const char *name,uint keys
   mi_int2store(share.state.header.base_pos,base_pos);
   share.state.header.language= (ci->language ?
 				ci->language : default_charset_info->number);
-  share.state.header.max_block_size=max_key_block_length/MI_MIN_KEY_BLOCK_LENGTH;
+  share.state.header.max_block_size_index= max_key_block_length/MI_MIN_KEY_BLOCK_LENGTH;
 
   share.state.dellink = HA_OFFSET_ERROR;
   share.state.process=	(ulong) getpid();
@@ -521,8 +532,12 @@ int mi_create(const char *name,uint keys
   mi_int2store(share.state.header.unique_key_parts,unique_key_parts);
 
   mi_set_all_keys_active(share.state.key_map, keys);
-  share.base.keystart = share.state.state.key_file_length=
-    MY_ALIGN(info_length, myisam_block_size);
+  aligned_key_start= my_round_up_to_next_power(max_key_block_length ?
+                                               max_key_block_length :
+                                               myisam_block_size);
+
+  share.base.keystart= share.state.state.key_file_length=
+    MY_ALIGN(info_length, aligned_key_start);
   share.base.max_key_block_length=max_key_block_length;
   share.base.max_key_length=ALIGN_SIZE(max_key_length+4);
   share.base.records=ci->max_rows;
@@ -556,6 +571,8 @@ int mi_create(const char *name,uint keys
 
   if (ci->index_file_name)
   {
+    char *iext= strrchr(ci->index_file_name, '.');
+    int have_iext= iext && !strcmp(iext, MI_NAME_IEXT);
     if (options & HA_OPTION_TMP_TABLE)
     {
       char *path;
@@ -563,13 +580,17 @@ int mi_create(const char *name,uint keys
       if ((path= strrchr(ci->index_file_name, FN_LIBCHAR)))
         *path= '\0';
       fn_format(filename, name, ci->index_file_name, MI_NAME_IEXT,
-                MY_REPLACE_DIR | MY_UNPACK_FILENAME);
+                MY_REPLACE_DIR | MY_UNPACK_FILENAME | MY_APPEND_EXT);
     }
     else
-      fn_format(filename, ci->index_file_name, "",
-                MI_NAME_IEXT, MY_UNPACK_FILENAME);
-    fn_format(linkname, name, "", MI_NAME_IEXT, MY_UNPACK_FILENAME);
-    linkname_ptr= linkname;
+    {
+      fn_format(filename, ci->index_file_name, "", MI_NAME_IEXT,
+                MY_UNPACK_FILENAME | (have_iext ? MY_REPLACE_EXT :
+                                      MY_APPEND_EXT));
+    }
+    fn_format(linkname, name, "", MI_NAME_IEXT,
+              MY_UNPACK_FILENAME|MY_APPEND_EXT);
+    linkname_ptr=linkname;
     /*
       Don't create the table if the link or file exists to ensure that one
       doesn't accidently destroy another table.
@@ -578,8 +599,10 @@ int mi_create(const char *name,uint keys
   }
   else
   {
-    fn_format(filename,name,"",MI_NAME_IEXT,(4+ (flags & HA_DONT_TOUCH_DATA) ?
-					     32 : 0));
+    fn_format(filename, name, "", MI_NAME_IEXT,
+              (MY_UNPACK_FILENAME |
+               (flags & HA_DONT_TOUCH_DATA) ? MY_RETURN_REAL_PATH : 0) |
+                MY_APPEND_EXT);
     linkname_ptr=0;
     /* Replace the current file */
     create_flag=MY_DELETE_OLD;
@@ -610,7 +633,8 @@ int mi_create(const char *name,uint keys
 #ifdef USE_RAID
     if (share.base.raid_type)
     {
-      (void) fn_format(filename,name,"",MI_NAME_DEXT,2+4);
+      (void) fn_format(filename, name, "", MI_NAME_DEXT,
+                       MY_UNPACK_FILENAME | MY_APPEND_EXT);
       if ((dfile=my_raid_create(filename, 0, create_mode,
 				share.base.raid_type,
 				share.base.raid_chunks,
@@ -623,6 +647,9 @@ int mi_create(const char *name,uint keys
     {
       if (ci->data_file_name)
       {
+        char *dext= strrchr(ci->data_file_name, '.');
+        int have_dext= dext && !strcmp(dext, MI_NAME_DEXT);
+
         if (options & HA_OPTION_TMP_TABLE)
         {
           char *path;
@@ -630,18 +657,24 @@ int mi_create(const char *name,uint keys
           if ((path= strrchr(ci->data_file_name, FN_LIBCHAR)))
             *path= '\0';
           fn_format(filename, name, ci->data_file_name, MI_NAME_DEXT,
-                    MY_REPLACE_DIR | MY_UNPACK_FILENAME);
+                    MY_REPLACE_DIR | MY_UNPACK_FILENAME | MY_APPEND_EXT);
         }
         else
-          fn_format(filename, ci->data_file_name, "",
-                    MI_NAME_DEXT, MY_UNPACK_FILENAME);
-        fn_format(linkname, name, "", MI_NAME_DEXT, MY_UNPACK_FILENAME);
-        linkname_ptr= linkname;
-        create_flag= 0;
+        {
+          fn_format(filename, ci->data_file_name, "", MI_NAME_DEXT,
+                    MY_UNPACK_FILENAME |
+                    (have_dext ? MY_REPLACE_EXT : MY_APPEND_EXT));
+        }
+
+	fn_format(linkname, name, "",MI_NAME_DEXT,
+	          MY_UNPACK_FILENAME | MY_APPEND_EXT);
+	linkname_ptr=linkname;
+	create_flag=0;
       }
       else
       {
-	fn_format(filename,name,"",MI_NAME_DEXT,4);
+	fn_format(filename,name,"", MI_NAME_DEXT,
+	          MY_UNPACK_FILENAME | MY_APPEND_EXT);
 	linkname_ptr=0;
 	create_flag=MY_DELETE_OLD;
       }
@@ -795,13 +828,15 @@ err:
   case 2:
   if (! (flags & HA_DONT_TOUCH_DATA))
-    my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_DEXT,2+4),
+    my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_DEXT,
+                                     MY_UNPACK_FILENAME | MY_APPEND_EXT),
 			   MYF(0));
     /* fall through */
   case 1:
     VOID(my_close(file,MYF(0)));
     if (! (flags & HA_DONT_TOUCH_DATA))
-      my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_IEXT,2+4),
+      my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_IEXT,
+                                       MY_UNPACK_FILENAME | MY_APPEND_EXT),
 			     MYF(0));
   }
   my_free((char*) rec_per_key_part, MYF(0));

--- 1.100/mysql-test/r/myisam.result	2007-01-19 13:08:16 +01:00
+++ 1.101/mysql-test/r/myisam.result	2007-01-19 13:08:16 +01:00
@@ -1619,6 +1619,11 @@ 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	10	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;
 End of 4.1 tests
 create table t1 (c1 int) engine=myisam pack_keys=0;
 create table t2 (c1 int) engine=myisam pack_keys=1;

--- 1.74/mysql-test/t/myisam.test	2007-01-19 13:08:16 +01:00
+++ 1.75/mysql-test/t/myisam.test	2007-01-19 13:08:16 +01:00
@@ -995,6 +995,14 @@ INSERT INTO t1 VALUES(1),(2);
 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;
 --echo End of 4.1 tests
 
 #
Thread
bk commit into 5.1 tree (istruewing:1.2378)ingo19 Jan