List:Commits« Previous MessageNext Message »
From:Sergei Golubchik Date:April 9 2008 5:33am
Subject:bk commit into 5.1 tree (serg:1.2562)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of serg.  When serg 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, 2008-04-09 07:33:19+02:00, serg@stripped +9 -0
  restore ft2 functionality, fix bugs.

  client/mysqltest.c@stripped, 2008-04-09 07:33:16+02:00, serg@stripped +2 -2
    fixed wrong #define

  mysql-test/mysql-test-run.pl@stripped, 2008-04-09 07:33:16+02:00, serg@stripped +5 -0
    myisam_ftdump support

  mysql-test/r/fulltext2.result@stripped, 2008-04-09 07:33:16+02:00, serg@stripped +374 -22
    verify that 2-level btree was created

  mysql-test/t/fulltext2.test@stripped, 2008-04-09 07:33:16+02:00, serg@stripped +11 -6
    verify that 2-level btree was created

  storage/myisam/ft_parser.c@stripped, 2008-04-09 07:33:16+02:00, serg@stripped +1 -1
    uchar* -> const uchar *

  storage/myisam/ft_update.c@stripped, 2008-04-09 07:33:16+02:00, serg@stripped +38 -20
    uchar* -> const uchar *
    remove useless casts (uchar* -> uchar*)
    small optimization - write more to the first page of ft2 (but need to
      sort first)
    bugfix: _mi_ck_write_btree modifies key[] and few bytes after it,
      write array elements backwards to prevent corruption 

  storage/myisam/ftdefs.h@stripped, 2008-04-09 07:33:16+02:00, serg@stripped +1 -1
    uchar* -> const uchar *

  storage/myisam/mi_delete.c@stripped, 2008-04-09 07:33:16+02:00, serg@stripped +2 -6
    report the correct error - when a key not found it's
    HA_ERR_KEY_NOT_FOUND, not HA_ERR_CRASHED. When a key not found means
    HA_ERR_CRASHED, the error will be changed to HA_ERR_CRASHED by the
    caller (mi_delete).

  storage/myisam/mi_write.c@stripped, 2008-04-09 07:33:16+02:00, serg@stripped +0 -4
    remove obsolete code, that disabled ft2 optimization.

diff -Nrup a/client/mysqltest.c b/client/mysqltest.c
--- a/client/mysqltest.c	2008-03-30 13:12:23 +02:00
+++ b/client/mysqltest.c	2008-04-09 07:33:16 +02:00
@@ -7845,8 +7845,8 @@ void free_replace_regex()
     buf= (char*)my_realloc(buf,need_buf_len,MYF(MY_WME+MY_FAE));        \
     res_p= buf + off;                                                   \
     buf_len= need_buf_len;                                              \
-  }                                                                     \
-                                                                        \
+  }
+
 /*
   Performs a regex substitution
 
diff -Nrup a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
--- a/mysql-test/mysql-test-run.pl	2008-03-25 16:27:21 +01:00
+++ b/mysql-test/mysql-test-run.pl	2008-04-09 07:33:16 +02:00
@@ -2182,6 +2182,11 @@ sub environment_setup () {
                         "$path_client_bindir/myisampack",
                         "$glob_basedir/storage/myisam/myisampack",
                         "$glob_basedir/myisam/myisampack"));
+  $ENV{'MYISAM_FTDUMP'}= mtr_native_path(mtr_exe_exists(
+                       vs_config_dirs('storage/myisam', 'myisam_ftdump'),
+                       vs_config_dirs('myisam', 'myisam_ftdump'),
+                       "$path_client_bindir/myisam_ftdump",
+                       "$glob_basedir/storage/myisam/myisam_ftdump"));
 
   # ----------------------------------------------------
   # We are nice and report a bit about our settings
diff -Nrup a/mysql-test/r/fulltext2.result b/mysql-test/r/fulltext2.result
--- a/mysql-test/r/fulltext2.result	2007-07-06 20:39:51 +02:00
+++ b/mysql-test/r/fulltext2.result	2008-04-09 07:33:16 +02:00
@@ -16,50 +16,150 @@ test.t1	optimize	status	OK
 check table t1;
 Table	Op	Msg_type	Msg_text
 test.t1	check	status	OK
+ =>               196 aaaxxx
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+ =>                99 aaazzz
 select count(*) from t1 where match a against ('aaaxxx');
 count(*)
-260
+196
 select count(*) from t1 where match a against ('aaayyy');
 count(*)
-250
+98
 select count(*) from t1 where match a against ('aaazzz');
 count(*)
-255
+99
 select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
 count(*)
-260
+196
 select count(*) from t1 where match a against ('aaayyy' in boolean mode);
 count(*)
-250
+98
 select count(*) from t1 where match a against ('aaazzz' in boolean mode);
 count(*)
-255
+99
 select count(*) from t1 where match a against ('aaaxxx aaayyy aaazzz');
 count(*)
-765
+393
 select count(*) from t1 where match a against ('aaaxxx aaayyy aaazzz' in boolean mode);
 count(*)
-765
+393
 select count(*) from t1 where match a against ('aaax*' in boolean mode);
 count(*)
-260
+196
 select count(*) from t1 where match a against ('aaay*' in boolean mode);
 count(*)
-250
+98
 select count(*) from t1 where match a against ('aaa*' in boolean mode);
 count(*)
-765
+393
 insert t1 (a) values ('aaaxxx'),('aaayyy');
 insert t1 (a) values ('aaazzz'),('aaazzz'),('aaazzz'),('aaazzz'),('aaazzz');
 select count(*) from t1 where match a against ('aaaxxx');
 count(*)
-261
+197
 select count(*) from t1 where match a against ('aaayyy');
 count(*)
-251
+99
 select count(*) from t1 where match a against ('aaazzz');
 count(*)
-260
+104
 insert t1 (a) values ('aaaxxx 000000');
 select count(*) from t1 where match a against ('000000');
 count(*)
@@ -70,23 +170,23 @@ count(*)
 0
 select count(*) from t1 where match a against ('aaaxxx');
 count(*)
-261
+197
 delete from t1 where match a against ('aaazzz');
 select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
 count(*)
-261
+197
 select count(*) from t1 where match a against ('aaayyy' in boolean mode);
 count(*)
-251
+99
 select count(*) from t1 where match a against ('aaazzz' in boolean mode);
 count(*)
 0
 select count(*) from t1 where a = 'aaaxxx';
 count(*)
-261
+197
 select count(*) from t1 where a = 'aaayyy';
 count(*)
-251
+99
 select count(*) from t1 where a = 'aaazzz';
 count(*)
 0
@@ -97,7 +197,7 @@ count(*)
 update t1 set a='aaazzz' where match a against ('000000');
 select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
 count(*)
-261
+197
 select count(*) from t1 where match a against ('aaazzz' in boolean mode);
 count(*)
 1
@@ -105,19 +205,271 @@ update t1 set a='aaazzz' where a = 'aaax
 update t1 set a='aaaxxx' where a = 'aaayyy';
 select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
 count(*)
-251
+99
 select count(*) from t1 where match a against ('aaayyy' in boolean mode);
 count(*)
 0
 select count(*) from t1 where match a against ('aaazzz' in boolean mode);
 count(*)
-262
+198
 drop table t1;
 CREATE TABLE t1 (
 i int(10) unsigned not null auto_increment primary key,
 a varchar(255) not null,
 FULLTEXT KEY (a)
 ) ENGINE=MyISAM;
+ =>               260 aaaxxx
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+            aaayyy
+ =>               255 aaazzz
 select count(*) from t1 where match a against ('aaaxxx');
 count(*)
 260
diff -Nrup a/mysql-test/t/fulltext2.test b/mysql-test/t/fulltext2.test
--- a/mysql-test/t/fulltext2.test	2007-07-06 20:37:22 +02:00
+++ b/mysql-test/t/fulltext2.test	2008-04-09 07:33:16 +02:00
@@ -16,17 +16,17 @@ CREATE TABLE t1 (
   FULLTEXT KEY (a)
 ) ENGINE=MyISAM;
 
-# two-level entry, second-level tree with depth 2
+# two-level entry
 --disable_query_log
-let $1=260;
+let $1=196;
 while ($1)
 {
   eval insert t1 (a) values ('aaaxxx');
   dec $1;
 }
 
-# two-level entry, second-level tree has only one page
-let $1=255;
+# two-level entry
+let $1=99;
 while ($1)
 {
   eval insert t1 (a) values ('aaazzz');
@@ -34,7 +34,7 @@ while ($1)
 }
 
 # one-level entry (entries)
-let $1=250;
+let $1=98;
 while ($1)
 {
   eval insert t1 (a) values ('aaayyy');
@@ -48,6 +48,9 @@ check table t1;
 optimize table t1; # BUG#5327 - mi_sort_index() of 2-level tree
 check table t1;
 
+--replace_regex / +[0-9a-f]{4} / / / [0-9]+\.[0-9]+ / /
+--exec $MYISAM_FTDUMP -d $MYSQLTEST_VARDIR/master-data/test/t1 1
+
 select count(*) from t1 where match a against ('aaaxxx');
 select count(*) from t1 where match a against ('aaayyy');
 select count(*) from t1 where match a against ('aaazzz');
@@ -110,7 +113,6 @@ CREATE TABLE t1 (
 # 2-level tree created by mi_write
 #
 
-# two-level entry, second-level tree with depth 2
 --disable_query_log
 let $1=260;
 while ($1)
@@ -131,6 +133,9 @@ while ($1)
   dec $1;
 }
 --enable_query_log
+
+--replace_regex / +[0-9a-f]{4} / / / [0-9]+\.[0-9]+ / /
+--exec $MYISAM_FTDUMP -d $MYSQLTEST_VARDIR/master-data/test/t1 1
 
 select count(*) from t1 where match a against ('aaaxxx');
 select count(*) from t1 where match a against ('aaayyy');
diff -Nrup a/storage/myisam/ft_parser.c b/storage/myisam/ft_parser.c
--- a/storage/myisam/ft_parser.c	2007-11-14 15:32:00 +01:00
+++ b/storage/myisam/ft_parser.c	2008-04-09 07:33:16 +02:00
@@ -302,7 +302,7 @@ static int ft_parse_internal(MYSQL_FTPAR
 }
 
 
-int ft_parse(TREE *wtree, uchar *doc, int doclen,
+int ft_parse(TREE *wtree, const uchar *doc, int doclen,
              struct st_mysql_ftparser *parser,
              MYSQL_FTPARSER_PARAM *param, MEM_ROOT *mem_root)
 {
diff -Nrup a/storage/myisam/ft_update.c b/storage/myisam/ft_update.c
--- a/storage/myisam/ft_update.c	2007-10-11 17:07:36 +02:00
+++ b/storage/myisam/ft_update.c	2008-04-09 07:33:16 +02:00
@@ -75,7 +75,7 @@ uint _mi_ft_segiterator(register FT_SEG_
   if (ftsi->seg->flag & HA_VAR_LENGTH_PART)
   {
     uint pack_length= (ftsi->seg->bit_start);
-    ftsi->len= (pack_length == 1 ? (uint) *(uchar*) ftsi->pos :
+    ftsi->len= (pack_length == 1 ? (uint) *ftsi->pos :
                 uint2korr(ftsi->pos));
     ftsi->pos+= pack_length;			 /* Skip VARCHAR length */
     DBUG_RETURN(1);
@@ -108,7 +108,7 @@ uint _mi_ft_parse(TREE *parsed, MI_INFO 
   while (_mi_ft_segiterator(&ftsi))
   {
     if (ftsi.pos)
-      if (ft_parse(parsed, (uchar *)ftsi.pos, ftsi.len, parser, param, mem_root))
+      if (ft_parse(parsed, ftsi.pos, ftsi.len, parser, param, mem_root))
         DBUG_RETURN(1);
   }
   DBUG_RETURN(0);
@@ -139,7 +139,7 @@ static int _mi_ft_store(MI_INFO *info, u
   for (; wlist->pos; wlist++)
   {
     key_length=_ft_make_key(info,keynr,keybuf,wlist,filepos);
-    if (_mi_ck_write(info,keynr,(uchar*) keybuf,key_length))
+    if (_mi_ck_write(info,keynr,keybuf,key_length))
       DBUG_RETURN(1);
    }
    DBUG_RETURN(0);
@@ -154,7 +154,7 @@ static int _mi_ft_erase(MI_INFO *info, u
   for (; wlist->pos; wlist++)
   {
     key_length=_ft_make_key(info,keynr,keybuf,wlist,filepos);
-    if (_mi_ck_delete(info,keynr,(uchar*) keybuf,key_length))
+    if (_mi_ck_delete(info,keynr,keybuf,key_length))
       err=1;
    }
    DBUG_RETURN(err);
@@ -180,8 +180,8 @@ int _mi_ft_cmp(MI_INFO *info, uint keynr
   {
     if ((ftsi1.pos != ftsi2.pos) &&
         (!ftsi1.pos || !ftsi2.pos ||
-         ha_compare_text(cs, (uchar*) ftsi1.pos,ftsi1.len,
-                         (uchar*) ftsi2.pos,ftsi2.len,0,0)))
+         ha_compare_text(cs, (uchar*)ftsi1.pos, ftsi1.len,
+                             (uchar*)ftsi2.pos, ftsi2.len, 0, 0)))
       DBUG_RETURN(THOSE_TWO_DAMN_KEYS_ARE_REALLY_DIFFERENT);
   }
   DBUG_RETURN(GEE_THEY_ARE_ABSOLUTELY_IDENTICAL);
@@ -209,20 +209,20 @@ int _mi_ft_update(MI_INFO *info, uint ke
   error=0;
   while(old_word->pos && new_word->pos)
   {
-    cmp= ha_compare_text(cs, (uchar*) old_word->pos,old_word->len,
-                             (uchar*) new_word->pos,new_word->len,0,0);
+    cmp= ha_compare_text(cs, old_word->pos,old_word->len,
+                             new_word->pos,new_word->len,0,0);
     cmp2= cmp ? 0 : (fabs(old_word->weight - new_word->weight) > 1.e-5);
 
     if (cmp < 0 || cmp2)
     {
       key_length=_ft_make_key(info,keynr,keybuf,old_word,pos);
-      if ((error=_mi_ck_delete(info,keynr,(uchar*) keybuf,key_length)))
+      if ((error=_mi_ck_delete(info,keynr, keybuf,key_length)))
         goto err;
     }
     if (cmp > 0 || cmp2)
     {
       key_length=_ft_make_key(info,keynr,keybuf,new_word,pos);
-      if ((error=_mi_ck_write(info,keynr,(uchar*) keybuf,key_length)))
+      if ((error=_mi_ck_write(info,keynr, keybuf,key_length)))
         goto err;
     }
     if (cmp<=0) old_word++;
@@ -293,7 +293,7 @@ uint _ft_make_key(MI_INFO *info, uint ke
 
   int2store(buf+HA_FT_WLEN,wptr->len);
   memcpy(buf+HA_FT_WLEN+2,wptr->pos,wptr->len);
-  DBUG_RETURN(_mi_make_key(info,keynr,(uchar*) keybuf,buf,filepos));
+  DBUG_RETURN(_mi_make_key(info,keynr, keybuf,buf,filepos));
 }
 
 
@@ -301,21 +301,22 @@ uint _ft_make_key(MI_INFO *info, uint ke
   convert key value to ft2
 */
 
+static int cmp_ft2_part(const void *keyinfo, const void *a, const void *b)
+{
+  return memcmp(((uchar*)a)+HA_FT_WLEN,
+                ((uchar*)b)+HA_FT_WLEN,
+                ((MI_KEYDEF *)keyinfo)->seg[1].length);
+}
+
 uint _mi_ft_convert_to_ft2(MI_INFO *info, uint keynr, uchar *key)
 {
   my_off_t root;
   DYNAMIC_ARRAY *da=info->ft1_to_ft2;
   MI_KEYDEF *keyinfo=&info->s->ft2_keyinfo;
-  uchar *key_ptr= (uchar*) dynamic_array_ptr(da, 0), *end;
+  uchar *key_ptr= dynamic_array_ptr(da, 0), *end;
   uint length, key_length;
   DBUG_ENTER("_mi_ft_convert_to_ft2");
 
-  /* we'll generate one pageful at once, and insert the rest one-by-one */
-  /* calculating the length of this page ...*/
-  length=(keyinfo->block_length-2) / keyinfo->keylength;
-  set_if_smaller(length, da->elements);
-  length=length * keyinfo->keylength;
-
   get_key_full_length_rdonly(key_length, key);
   while (_mi_ck_delete(info, keynr, key, key_length) == 0)
   {
@@ -325,6 +326,13 @@ uint _mi_ft_convert_to_ft2(MI_INFO *info
      */
   }
 
+  /* we'll generate one pageful at once, and insert the rest one-by-one */
+  /* calculating the length of this page ...*/
+  length=(keyinfo->block_length-2) / keyinfo->keylength;
+  set_if_smaller(length, da->elements);
+  my_qsort2(da->buffer, length, keyinfo->keylength, cmp_ft2_part, keyinfo);
+  length=length * keyinfo->keylength;
+
   /* creating pageful of keys */
   mi_putint(info->buff,length+2,0);
   memcpy(info->buff+2, key_ptr, length);
@@ -333,11 +341,21 @@ uint _mi_ft_convert_to_ft2(MI_INFO *info
       _mi_write_keypage(info,keyinfo,root,DFLT_INIT_HITS,info->buff))
     DBUG_RETURN(-1);
 
+  /*
+    _mi_ck_real_write_btree() may overwrite it's key_ptr argument,
+    and key_reflength bytes after it. That's why we write array
+    elements backwards and reserve a space after the last element.
+  */
+  allocate_dynamic(da, da->elements+1);
+
   /* inserting the rest of key values */
-  end= (uchar*) dynamic_array_ptr(da, da->elements);
-  for (key_ptr+=length; key_ptr < end; key_ptr+=keyinfo->keylength)
+  key_ptr= dynamic_array_ptr(da, da->elements-1);
+  end= dynamic_array_ptr(da, 0) + length;
+  for (; key_ptr >= end; key_ptr-= keyinfo->keylength)
+  {
     if(_mi_ck_real_write_btree(info, keyinfo, key_ptr, 0, &root, SEARCH_SAME))
       DBUG_RETURN(-1);
+  }
 
   /* now, writing the word key entry */
   ft_intXstore(key+key_length, - (int) da->elements);
diff -Nrup a/storage/myisam/ftdefs.h b/storage/myisam/ftdefs.h
--- a/storage/myisam/ftdefs.h	2007-05-10 11:59:32 +02:00
+++ b/storage/myisam/ftdefs.h	2008-04-09 07:33:16 +02:00
@@ -121,7 +121,7 @@ void _mi_ft_segiterator_dummy_init(const
 uint _mi_ft_segiterator(FT_SEG_ITERATOR *);
 
 void ft_parse_init(TREE *, CHARSET_INFO *);
-int ft_parse(TREE *, uchar *, int, struct st_mysql_ftparser *parser,
+int ft_parse(TREE *, const uchar *, int, struct st_mysql_ftparser *parser,
              MYSQL_FTPARSER_PARAM *, MEM_ROOT *);
 FT_WORD * ft_linearize(TREE *, MEM_ROOT *);
 FT_WORD * _mi_ft_parserecord(MI_INFO *, uint, const uchar *, MEM_ROOT *);
diff -Nrup a/storage/myisam/mi_delete.c b/storage/myisam/mi_delete.c
--- a/storage/myisam/mi_delete.c	2008-03-29 09:00:49 +01:00
+++ b/storage/myisam/mi_delete.c	2008-04-09 07:33:16 +02:00
@@ -154,10 +154,7 @@ static int _mi_ck_real_delete(register M
   DBUG_ENTER("_mi_ck_real_delete");
 
   if ((old_root=*root) == HA_OFFSET_ERROR)
-  {
-    mi_print_error(info->s, HA_ERR_CRASHED);
-    DBUG_RETURN(my_errno=HA_ERR_CRASHED);
-  }
+    DBUG_RETURN(my_errno=HA_ERR_KEY_NOT_FOUND);
   if (!(root_buff= (uchar*) my_alloca((uint) keyinfo->block_length+
 				      MI_MAX_KEY_BUFF*2)))
   {
@@ -322,8 +319,7 @@ static int d_search(register MI_INFO *in
     if (!nod_flag)
     {
       DBUG_PRINT("error",("Didn't find key"));
-      mi_print_error(info->s, HA_ERR_CRASHED);
-      my_errno=HA_ERR_CRASHED;		/* This should newer happend */
+      my_errno=HA_ERR_KEY_NOT_FOUND;
       goto err;
     }
     save_flag=0;
diff -Nrup a/storage/myisam/mi_write.c b/storage/myisam/mi_write.c
--- a/storage/myisam/mi_write.c	2008-03-31 09:40:37 +02:00
+++ b/storage/myisam/mi_write.c	2008-04-09 07:33:16 +02:00
@@ -537,11 +537,7 @@ int _mi_insert(register MI_INFO *info, r
       uint alen, blen, ft2len=info->s->ft2_keyinfo.keylength;
       /* the very first key on the page is always unpacked */
       DBUG_ASSERT((*b & 128) == 0);
-#if HA_FT_MAXLEN >= 127
       blen= mi_uint2korr(b); b+=2;
-#else
-      blen= *b++;
-#endif
       get_key_length(alen,a);
       DBUG_ASSERT(info->ft1_to_ft2==0);
       if (alen == blen &&
Thread
bk commit into 5.1 tree (serg:1.2562)Sergei Golubchik9 Apr