List:Commits« Previous MessageNext Message »
From:ingo Date:July 6 2006 11:18am
Subject:bk commit into 5.1 tree (ingo:1.2247)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of mydev. When mydev 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
  1.2247 06/07/06 13:18:00 ingo@stripped +30 -0
  Merge chilla.local:/home/mydev/mysql-5.0-ateam
  into  chilla.local:/home/mydev/mysql-5.1-ateam

  sql/item_timefunc.cc
    1.123 06/07/06 13:17:54 ingo@stripped +0 -3
    Manual merge

  mysql-test/t/ctype_utf8.test
    1.85 06/07/06 13:17:54 ingo@stripped +0 -0
    Manual merge

  mysql-test/r/key.result
    1.37 06/07/06 13:17:54 ingo@stripped +0 -2
    Manual merge

  mysql-test/r/ctype_utf8.result
    1.94 06/07/06 13:17:54 ingo@stripped +0 -0
    Manual merge

  support-files/mysql.spec.sh
    1.151 06/07/06 13:09:31 ingo@stripped +0 -0
    Auto merged

  storage/myisam/rt_mbr.c
    1.11 06/07/06 13:09:31 ingo@stripped +0 -0
    Auto merged

  storage/myisam/rt_index.c
    1.18 06/07/06 13:09:31 ingo@stripped +0 -0
    Auto merged

  storage/myisam/mi_rkey.c
    1.22 06/07/06 13:09:31 ingo@stripped +0 -0
    Auto merged

  storage/myisam/mi_key.c
    1.51 06/07/06 13:09:31 ingo@stripped +0 -1
    Auto merged

  storage/myisam/mi_dynrec.c
    1.44 06/07/06 13:09:31 ingo@stripped +0 -0
    Auto merged

  storage/myisam/mi_delete_table.c
    1.12 06/07/06 13:09:31 ingo@stripped +0 -0
    Auto merged

  storage/myisam/mi_create.c
    1.58 06/07/06 13:09:31 ingo@stripped +0 -0
    Auto merged

  storage/myisam/mi_check.c
    1.149 06/07/06 13:09:30 ingo@stripped +0 -0
    Auto merged

  sql/table.cc
    1.228 06/07/06 13:09:30 ingo@stripped +0 -0
    Auto merged

  sql/sql_parse.cc
    1.567 06/07/06 13:09:30 ingo@stripped +0 -0
    Auto merged

  sql/sql_class.cc
    1.272 06/07/06 13:09:30 ingo@stripped +0 -0
    Auto merged

  sql/opt_sum.cc
    1.55 06/07/06 13:09:30 ingo@stripped +0 -0
    Auto merged

  sql-common/client.c
    1.99 06/07/06 13:09:30 ingo@stripped +0 -0
    Auto merged

  sql/field.cc
    1.325 06/07/06 13:09:29 ingo@stripped +0 -0
    Auto merged

  scripts/make_binary_distribution.sh
    1.122 06/07/06 13:09:29 ingo@stripped +0 -0
    Auto merged

  mysql-test/t/myisam.test
    1.61 06/07/06 13:09:29 ingo@stripped +0 -0
    Auto merged

  mysql-test/t/key.test
    1.29 06/07/06 13:09:29 ingo@stripped +0 -0
    Auto merged

  mysql-test/t/func_time.test
    1.49 06/07/06 13:09:29 ingo@stripped +0 -0
    Auto merged

  mysql-test/r/symlink.result
    1.26 06/07/06 13:09:29 ingo@stripped +0 -0
    Auto merged

  mysql-test/r/myisam.result
    1.84 06/07/06 13:09:29 ingo@stripped +0 -0
    Auto merged

  mysql-test/r/gis-rtree.result
    1.19 06/07/06 13:09:29 ingo@stripped +0 -0
    Auto merged

  mysql-test/r/func_time.result
    1.61 06/07/06 13:09:29 ingo@stripped +0 -0
    Auto merged

  mysql-test/r/func_sapdb.result
    1.17 06/07/06 13:09:29 ingo@stripped +0 -0
    Auto merged

  storage/myisam/rt_mbr.c
    1.9.1.2 06/07/06 13:09:28 ingo@stripped +0 -0
    Merge rename: myisam/rt_mbr.c -> storage/myisam/rt_mbr.c

  storage/myisam/rt_index.c
    1.16.1.2 06/07/06 13:09:28 ingo@stripped +0 -0
    Merge rename: myisam/rt_index.c -> storage/myisam/rt_index.c

  storage/myisam/mi_rkey.c
    1.18.3.2 06/07/06 13:09:28 ingo@stripped +0 -0
    Merge rename: myisam/mi_rkey.c -> storage/myisam/mi_rkey.c

  storage/myisam/mi_key.c
    1.38.12.2 06/07/06 13:09:28 ingo@stripped +0 -0
    Merge rename: myisam/mi_key.c -> storage/myisam/mi_key.c

  storage/myisam/mi_dynrec.c
    1.37.3.2 06/07/06 13:09:28 ingo@stripped +0 -0
    Merge rename: myisam/mi_dynrec.c -> storage/myisam/mi_dynrec.c

  storage/myisam/mi_delete_table.c
    1.9.1.2 06/07/06 13:09:28 ingo@stripped +0 -0
    Merge rename: myisam/mi_delete_table.c -> storage/myisam/mi_delete_table.c

  storage/myisam/mi_create.c
    1.45.9.2 06/07/06 13:09:28 ingo@stripped +0 -0
    Merge rename: myisam/mi_create.c -> storage/myisam/mi_create.c

  storage/myisam/mi_check.c
    1.129.14.2 06/07/06 13:09:28 ingo@stripped +0 -0
    Merge rename: myisam/mi_check.c -> storage/myisam/mi_check.c

  libmysqld/libmysqld.c
    1.69 06/07/06 13:09:28 ingo@stripped +0 -0
    Auto merged

  libmysqld/lib_sql.cc
    1.115 06/07/06 13:09:28 ingo@stripped +0 -0
    Auto merged

# 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:	ingo
# Host:	chilla.local
# Root:	/home/mydev/mysql-5.1-ateam/RESYNC

--- 1.129.14.1/myisam/mi_check.c	2006-07-05 11:23:16 +02:00
+++ 1.149/storage/myisam/mi_check.c	2006-07-06 13:09:30 +02:00
@@ -358,7 +358,7 @@ int chk_key(MI_CHECK *param, register MI
     puts("- check key delete-chain");
 
   param->key_file_blocks=info->s->base.keystart;
-  for (key=0 ; key < info->s->state.header.max_block_size ; key++)
+  for (key=0 ; key < info->s->state.header.max_block_size_index ; key++)
     if (check_k_link(param,info,key))
     {
       if (param->testflag & T_VERBOSE) puts("");
@@ -1411,7 +1411,7 @@ int mi_repair(MI_CHECK *param, register 
     share->state.key_root[i]= HA_OFFSET_ERROR;
 
   /* Drop the delete chain. */
-  for (i=0 ; i < share->state.header.max_block_size ; i++)
+  for (i=0 ; i < share->state.header.max_block_size_index ; i++)
     share->state.key_del[i]=  HA_OFFSET_ERROR;
 
   /*
@@ -1795,7 +1795,7 @@ int mi_sort_index(MI_CHECK *param, regis
   info->update= (short) (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
   for (key=0 ; key < info->s->base.keys ; key++)
     info->s->state.key_root[key]=index_pos[key];
-  for (key=0 ; key < info->s->state.header.max_block_size ; key++)
+  for (key=0 ; key < info->s->state.header.max_block_size_index ; key++)
     info->s->state.key_del[key]=  HA_OFFSET_ERROR;
 
   info->s->state.changed&= ~STATE_NOT_SORTED_PAGES;
@@ -2095,7 +2095,7 @@ int mi_repair_by_sort(MI_CHECK *param, r
     /* Clear the pointers to the given rows */
     for (i=0 ; i < share->base.keys ; i++)
       share->state.key_root[i]= HA_OFFSET_ERROR;
-    for (i=0 ; i < share->state.header.max_block_size ; i++)
+    for (i=0 ; i < share->state.header.max_block_size_index ; i++)
       share->state.key_del[i]=  HA_OFFSET_ERROR;
     info->state->key_file_length=share->base.keystart;
   }
@@ -2117,6 +2117,7 @@ int mi_repair_by_sort(MI_CHECK *param, r
     my_seek(param->read_cache.file,0L,MY_SEEK_END,MYF(0));
 
   sort_param.wordlist=NULL;
+  init_alloc_root(&sort_param.wordroot, FTPARSER_MEMROOT_ALLOC_SIZE, 0);
 
   if (share->data_file_type == DYNAMIC_RECORD)
     length=max(share->base.min_pack_length+1,share->base.min_block_length);
@@ -2179,12 +2180,36 @@ int mi_repair_by_sort(MI_CHECK *param, r
     {
       uint ft_max_word_len_for_sort=FT_MAX_WORD_LEN_FOR_SORT*
                                     sort_param.keyinfo->seg->charset->mbmaxlen;
-      sort_info.max_records=
-        (ha_rows) (sort_info.filelength/ft_min_word_len+1);
+      sort_param.key_length+=ft_max_word_len_for_sort-HA_FT_MAXBYTELEN;
+      /*
+        fulltext indexes may have much more entries than the
+        number of rows in the table. We estimate the number here.
+
+        Note, built-in parser is always nr. 0 - see ftparser_call_initializer()
+      */
+      if (sort_param.keyinfo->ftparser_nr == 0)
+      {
+        /*
+          for built-in parser the number of generated index entries
+          cannot be larger than the size of the data file divided
+          by the minimal word's length
+        */
+        sort_info.max_records=
+          (ha_rows) (sort_info.filelength/ft_min_word_len+1);
+      }
+      else
+      {
+        /*
+          for external plugin parser we cannot tell anything at all :(
+          so, we'll use all the sort memory and start from ~10 buffpeks.
+          (see _create_index_by_sort)
+        */
+        sort_info.max_records=
+          10*param->sort_buffer_length/sort_param.key_length;
+      }
 
       sort_param.key_read=sort_ft_key_read;
       sort_param.key_write=sort_ft_key_write;
-      sort_param.key_length+=ft_max_word_len_for_sort-HA_FT_MAXBYTELEN;
     }
     else
     {
@@ -2200,6 +2225,7 @@ int mi_repair_by_sort(MI_CHECK *param, r
       goto err;
     }
     param->calc_checksum=0;			/* No need to calc glob_crc */
+    free_root(&sort_param.wordroot, MYF(0));
 
     /* Set for next loop */
     sort_info.max_records= (ha_rows) info->state->records;
@@ -2463,7 +2489,7 @@ int mi_repair_parallel(MI_CHECK *param, 
     /* Clear the pointers to the given rows */
     for (i=0 ; i < share->base.keys ; i++)
       share->state.key_root[i]= HA_OFFSET_ERROR;
-    for (i=0 ; i < share->state.header.max_block_size ; i++)
+    for (i=0 ; i < share->state.header.max_block_size_index ; i++)
       share->state.key_del[i]=  HA_OFFSET_ERROR;
     info->state->key_file_length=share->base.keystart;
   }
@@ -2589,6 +2615,7 @@ int mi_repair_parallel(MI_CHECK *param, 
       uint ft_max_word_len_for_sort=FT_MAX_WORD_LEN_FOR_SORT*
                                     sort_param[i].keyinfo->seg->charset->mbmaxlen;
       sort_param[i].key_length+=ft_max_word_len_for_sort-HA_FT_MAXBYTELEN;
+      init_alloc_root(&sort_param[i].wordroot, FTPARSER_MEMROOT_ALLOC_SIZE, 0);
     }
   }
   sort_info.total_keys=i;
@@ -2810,10 +2837,11 @@ static int sort_ft_key_read(MI_SORT_PARA
   {
     for (;;)
     {
-      my_free((char*) wptr, MYF(MY_ALLOW_ZERO_PTR));
+      free_root(&sort_param->wordroot, MYF(MY_MARK_BLOCKS_FREE));
       if ((error=sort_get_next_record(sort_param)))
         DBUG_RETURN(error);
-      if (!(wptr=_mi_ft_parserecord(info,sort_param->key,sort_param->record)))
+      if (!(wptr=_mi_ft_parserecord(info,sort_param->key,sort_param->record,
+                                    &sort_param->wordroot)))
         DBUG_RETURN(1);
       if (wptr->pos)
         break;
@@ -2837,7 +2865,7 @@ static int sort_ft_key_read(MI_SORT_PARA
 #endif
   if (!wptr->pos)
   {
-    my_free((char*) sort_param->wordlist, MYF(0));
+    free_root(&sort_param->wordroot, MYF(MY_MARK_BLOCKS_FREE));
     sort_param->wordlist=0;
     error=sort_write_record(sort_param);
   }
@@ -3901,9 +3929,6 @@ int recreate_table(MI_CHECK *param, MI_I
 
   create_info.data_file_length=file_length;
   create_info.auto_increment=share.state.auto_increment;
-  create_info.raid_type=   share.base.raid_type;
-  create_info.raid_chunks= share.base.raid_chunks;
-  create_info.raid_chunksize= share.base.raid_chunksize;
   create_info.language = (param->language ? param->language :
 			  share.state.header.language);
   create_info.key_file_length=  status_info.key_file_length;

--- 1.45.9.1/myisam/mi_create.c	2006-07-05 11:05:02 +02:00
+++ 1.58/storage/myisam/mi_create.c	2006-07-06 13:09:31 +02:00
@@ -28,9 +28,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,
@@ -45,6 +45,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;
@@ -185,6 +186,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)
@@ -428,8 +431,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= 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)
     {
@@ -495,7 +506,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();
@@ -522,8 +533,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;
@@ -557,8 +572,13 @@ int mi_create(const char *name,uint keys
 
   if (ci->index_file_name)
   {
-    fn_format(filename, ci->index_file_name,"",MI_NAME_IEXT,4);
-    fn_format(linkname,name, "",MI_NAME_IEXT,4);
+    char *iext= strrchr(ci->index_file_name, '.');
+    int have_iext= iext && !strcmp(iext, MI_NAME_IEXT);
+    
+    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
@@ -568,8 +588,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;
@@ -600,7 +622,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,
@@ -613,14 +636,21 @@ int mi_create(const char *name,uint keys
     {
       if (ci->data_file_name)
       {
-	fn_format(filename, ci->data_file_name,"",MI_NAME_DEXT,4);
-	fn_format(linkname, name, "",MI_NAME_DEXT,4);
+        char *dext= strrchr(ci->data_file_name, '.');
+        int have_dext= dext && !strcmp(dext, MI_NAME_DEXT);
+
+	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;
       }
@@ -774,13 +804,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.9.1.1/myisam/mi_delete_table.c	2006-06-27 11:26:29 +02:00
+++ 1.12/storage/myisam/mi_delete_table.c	2006-07-06 13:09:31 +02:00
@@ -58,10 +58,10 @@ int mi_delete_table(const char *name)
 #endif
 #endif /* USE_RAID */
 
-  fn_format(from,name,"",MI_NAME_IEXT,4);
+  fn_format(from,name,"",MI_NAME_IEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT);
   if (my_delete_with_symlink(from, MYF(MY_WME)))
     DBUG_RETURN(my_errno);
-  fn_format(from,name,"",MI_NAME_DEXT,4);
+  fn_format(from,name,"",MI_NAME_DEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT);
 #ifdef USE_RAID
   if (raid_type)
     DBUG_RETURN(my_raid_delete(from, raid_chunks, MYF(MY_WME)) ? my_errno : 0);

--- 1.37.3.1/myisam/mi_dynrec.c	2006-07-05 11:24:43 +02:00
+++ 1.44/storage/myisam/mi_dynrec.c	2006-07-06 13:09:31 +02:00
@@ -50,6 +50,180 @@ static int _mi_cmp_buffer(File file, con
 
 	/* Interface function from MI_INFO */
 
+#ifdef HAVE_MMAP
+
+/*
+  Create mmaped area for MyISAM handler
+
+  SYNOPSIS
+    mi_dynmap_file()
+    info		MyISAM handler
+
+  RETURN
+    0  ok
+    1  error.
+*/
+
+my_bool mi_dynmap_file(MI_INFO *info, my_off_t size)
+{
+  DBUG_ENTER("mi_dynmap_file");
+  if (size > (my_off_t) (~((size_t) 0)) - MEMMAP_EXTRA_MARGIN)
+  {
+    DBUG_PRINT("warning", ("File is too large for mmap"));
+    DBUG_RETURN(1);
+  }
+  info->s->file_map= (byte*)
+                  my_mmap(0, (size_t)(size + MEMMAP_EXTRA_MARGIN),
+                          info->s->mode==O_RDONLY ? PROT_READ :
+                          PROT_READ | PROT_WRITE,
+                          MAP_SHARED | MAP_NORESERVE,
+                          info->dfile, 0L);
+  if (info->s->file_map == (byte*) MAP_FAILED)
+  {
+    info->s->file_map= NULL;
+    DBUG_RETURN(1);
+  }
+#if defined(HAVE_MADVISE)
+  madvise(info->s->file_map, size, MADV_RANDOM);
+#endif
+  info->s->mmaped_length= size;
+  DBUG_RETURN(0);
+}
+
+
+/*
+  Resize mmaped area for MyISAM handler
+
+  SYNOPSIS
+    mi_remap_file()
+    info		MyISAM handler
+
+  RETURN
+*/
+
+void mi_remap_file(MI_INFO *info, my_off_t size)
+{
+  if (info->s->file_map)
+  {
+    VOID(my_munmap(info->s->file_map,
+                   (size_t) info->s->mmaped_length + MEMMAP_EXTRA_MARGIN));
+    mi_dynmap_file(info, size);
+  }
+}
+#endif
+
+
+/*
+  Read bytes from MySAM handler, using mmap or pread
+
+  SYNOPSIS
+    mi_mmap_pread()
+    info		MyISAM handler
+    Buffer              Input buffer
+    Count               Count of bytes for read
+    offset              Start position
+    MyFlags             
+
+  RETURN
+    0  ok
+*/
+
+uint mi_mmap_pread(MI_INFO *info, byte *Buffer,
+                    uint Count, my_off_t offset, myf MyFlags)
+{
+  DBUG_PRINT("info", ("mi_read with mmap %d\n", info->dfile));
+  if (info->s->concurrent_insert)
+    rw_rdlock(&info->s->mmap_lock);
+
+  /*
+    The following test may fail in the following cases:
+    - We failed to remap a memory area (fragmented memory?)
+    - This thread has done some writes, but not yet extended the
+    memory mapped area.
+  */
+
+  if (info->s->mmaped_length >= offset + Count)
+  {
+    memcpy(Buffer, info->s->file_map + offset, Count);
+    if (info->s->concurrent_insert)
+      rw_unlock(&info->s->mmap_lock);
+    return 0;
+  }
+  else
+  {
+    if (info->s->concurrent_insert)
+      rw_unlock(&info->s->mmap_lock);
+    return my_pread(info->dfile, Buffer, Count, offset, MyFlags);
+  }
+}
+
+
+        /* wrapper for my_pread in case if mmap isn't used */
+
+uint mi_nommap_pread(MI_INFO *info, byte *Buffer,
+                      uint Count, my_off_t offset, myf MyFlags)
+{
+  return my_pread(info->dfile, Buffer, Count, offset, MyFlags);
+}
+
+
+/*
+  Write bytes to MySAM handler, using mmap or pwrite
+
+  SYNOPSIS
+    mi_mmap_pwrite()
+    info		MyISAM handler
+    Buffer              Output buffer
+    Count               Count of bytes for write
+    offset              Start position
+    MyFlags             
+
+  RETURN
+    0  ok
+    !=0  error.  In this case return error from pwrite
+*/
+
+uint mi_mmap_pwrite(MI_INFO *info, byte *Buffer,
+                     uint Count, my_off_t offset, myf MyFlags)
+{
+  DBUG_PRINT("info", ("mi_write with mmap %d\n", info->dfile));
+  if (info->s->concurrent_insert)
+    rw_rdlock(&info->s->mmap_lock);
+
+  /*
+    The following test may fail in the following cases:
+    - We failed to remap a memory area (fragmented memory?)
+    - This thread has done some writes, but not yet extended the
+    memory mapped area.
+  */
+
+  if (info->s->mmaped_length >= offset + Count)
+  {
+    memcpy(info->s->file_map + offset, Buffer, Count); 
+    if (info->s->concurrent_insert)
+      rw_unlock(&info->s->mmap_lock);
+    return 0;
+  }
+  else
+  {
+    info->s->nonmmaped_inserts++;
+    if (info->s->concurrent_insert)
+      rw_unlock(&info->s->mmap_lock);
+    return my_pwrite(info->dfile, Buffer, Count, offset, MyFlags);
+  }
+
+}
+
+
+        /* wrapper for my_pwrite in case if mmap isn't used */
+
+uint mi_nommap_pwrite(MI_INFO *info, byte *Buffer,
+                      uint Count, my_off_t offset, myf MyFlags)
+{
+  return my_pwrite(info->dfile, Buffer, Count, offset, MyFlags);
+}
+
+
 int _mi_write_dynamic_record(MI_INFO *info, const byte *record)
 {
   ulong reclength=_mi_rec_pack(info,info->rec_buff,record);
@@ -243,7 +417,7 @@ static bool unlink_deleted_block(MI_INFO
 	  & BLOCK_DELETED))
       DBUG_RETURN(1);				/* Something is wrong */
     mi_sizestore(tmp.header+4,block_info->next_filepos);
-    if (my_pwrite(info->dfile,(char*) tmp.header+4,8,
+    if (info->s->file_write(info,(char*) tmp.header+4,8,
 		  block_info->prev_filepos+4, MYF(MY_NABP)))
       DBUG_RETURN(1);
     /* Unlink block from next block */
@@ -253,7 +427,7 @@ static bool unlink_deleted_block(MI_INFO
 	    & BLOCK_DELETED))
 	DBUG_RETURN(1);				/* Something is wrong */
       mi_sizestore(tmp.header+12,block_info->prev_filepos);
-      if (my_pwrite(info->dfile,(char*) tmp.header+12,8,
+      if (info->s->file_write(info,(char*) tmp.header+12,8,
 		    block_info->next_filepos+12,
 		    MYF(MY_NABP)))
 	DBUG_RETURN(1);
@@ -304,7 +478,7 @@ static int update_backward_delete_link(M
     {
       char buff[8];
       mi_sizestore(buff,filepos);
-      if (my_pwrite(info->dfile,buff, 8, delete_block+12, MYF(MY_NABP)))
+      if (info->s->file_write(info,buff, 8, delete_block+12, MYF(MY_NABP)))
 	DBUG_RETURN(1);				/* Error on write */
     }
     else
@@ -362,7 +536,7 @@ static int delete_dynamic_record(MI_INFO
       bfill(block_info.header+12,8,255);
     else
       mi_sizestore(block_info.header+12,block_info.next_filepos);
-    if (my_pwrite(info->dfile,(byte*) block_info.header,20,filepos,
+    if (info->s->file_write(info,(byte*) block_info.header,20,filepos,
 		  MYF(MY_NABP)))
       DBUG_RETURN(1);
     info->s->state.dellink = filepos;
@@ -545,7 +719,7 @@ int _mi_write_part_record(MI_INFO *info,
   else
   {
     info->rec_cache.seek_not_done=1;
-    if (my_pwrite(info->dfile,(byte*) *record-head_length,length+extra_length+
+    if (info->s->file_write(info,(byte*) *record-head_length,length+extra_length+
 		  del_length,filepos,info->s->write_flag))
       goto err;
   }
@@ -655,7 +829,7 @@ static int update_dynamic_record(MI_INFO
 	      mi_int3store(del_block.header+1, rest_length);
 	      mi_sizestore(del_block.header+4,info->s->state.dellink);
 	      bfill(del_block.header+12,8,255);
-	      if (my_pwrite(info->dfile,(byte*) del_block.header,20, next_pos,
+	      if (info->s->file_write(info,(byte*) del_block.header,20, next_pos,
 			    MYF(MY_NABP)))
 		DBUG_RETURN(1);
 	      info->s->state.dellink= next_pos;
@@ -1185,7 +1359,7 @@ int _mi_read_dynamic_record(MI_INFO *inf
       }
       if (left_length < block_info.data_len || ! block_info.data_len)
 	goto panic;			/* Wrong linked record */
-      if (my_pread(file,(byte*) to,block_info.data_len,block_info.filepos,
+      if (info->s->file_read(info,(byte*) to,block_info.data_len,block_info.filepos,
 		   MYF(MY_NABP)))
 	goto panic;
       left_length-=block_info.data_len;

--- 1.122/sql/item_timefunc.cc	2006-06-18 12:20:27 +02:00
+++ 1.123/sql/item_timefunc.cc	2006-07-06 13:17:54 +02:00
@@ -27,6 +27,7 @@
 
 /* TODO: Move month and days to language files */
 
+/* Day number for Dec 31st, 9999 */
 #define MAX_DAY_NUMBER 3652424L
 
 static const char *month_names[]=
@@ -408,7 +409,7 @@ static bool extract_date_time(DATE_TIME_
   if (yearday > 0)
   {
     uint days= calc_daynr(l_time->year,1,1) +  yearday - 1;
-    if (days <= 0 || days >= MAX_DAY_NUMBER)
+    if (days <= 0 || days > MAX_DAY_NUMBER)
       goto err;
     get_date_from_daynr(days,&l_time->year,&l_time->month,&l_time->day);
   }
@@ -454,7 +455,7 @@ static bool extract_date_time(DATE_TIME_
              (weekday - 1);
     }
 
-    if (days <= 0 || days >= MAX_DAY_NUMBER)
+    if (days <= 0 || days > MAX_DAY_NUMBER)
       goto err;
     get_date_from_daynr(days,&l_time->year,&l_time->month,&l_time->day);
   }
@@ -1962,7 +1963,6 @@ bool Item_date_add_interval::get_date(TI
 
   if (date_sub_interval)
     interval.neg = !interval.neg;
-
   if (ltime->year < YY_MAGIC_BELOW)
     return (null_value=1);
 
@@ -2450,7 +2450,7 @@ String *Item_func_makedate::val_str(Stri
 
   days= calc_daynr(yearnr,1,1) + daynr - 1;
   /* Day number from year 0 to 9999-12-31 */
-  if (days >= 0 && days < MAX_DAY_NUMBER)
+  if (days >= 0 && days <= MAX_DAY_NUMBER)
   {
     null_value=0;
     get_date_from_daynr(days,&l_time.year,&l_time.month,&l_time.day);

--- 1.271/sql/sql_class.cc	2006-06-30 14:08:17 +02:00
+++ 1.272/sql/sql_class.cc	2006-07-06 13:09:30 +02:00
@@ -1015,7 +1015,7 @@ bool select_send::send_data(List<Item> &
   Protocol *protocol= thd->protocol;
   char buff[MAX_FIELD_WIDTH];
   String buffer(buff, sizeof(buff), &my_charset_bin);
-  DBUG_ENTER("send_data");
+  DBUG_ENTER("select_send::send_data");
 
   protocol->prepare_for_resend();
   Item *item;
@@ -1228,7 +1228,7 @@ select_export::prepare(List<Item> &list,
 bool select_export::send_data(List<Item> &items)
 {
 
-  DBUG_ENTER("send_data");
+  DBUG_ENTER("select_export::send_data");
   char buff[MAX_FIELD_WIDTH],null_buff[2],space[MAX_FIELD_WIDTH];
   bool space_inited=0;
   String tmp(buff,sizeof(buff),&my_charset_bin),*res;
@@ -1385,7 +1385,7 @@ bool select_dump::send_data(List<Item> &
   String tmp(buff,sizeof(buff),&my_charset_bin),*res;
   tmp.length(0);
   Item *item;
-  DBUG_ENTER("send_data");
+  DBUG_ENTER("select_dump::send_data");
 
   if (unit->offset_limit_cnt)
   {						// using limit offset,count

--- 1.566/sql/sql_parse.cc	2006-07-04 10:02:05 +02:00
+++ 1.567/sql/sql_parse.cc	2006-07-06 13:09:30 +02:00
@@ -823,6 +823,37 @@ static void reset_mqh(LEX_USER *lu, bool
 #endif /* NO_EMBEDDED_ACCESS_CHECKS */
 }
 
+void thd_init_client_charset(THD *thd, uint cs_number)
+{
+  /*
+   Use server character set and collation if
+   - opt_character_set_client_handshake is not set
+   - client has not specified a character set
+   - client character set is the same as the servers
+   - client character set doesn't exists in server
+  */
+  if (!opt_character_set_client_handshake ||
+      !(thd->variables.character_set_client= get_charset(cs_number, MYF(0))) ||
+      !my_strcasecmp(&my_charset_latin1,
+                     global_system_variables.character_set_client->name,
+                     thd->variables.character_set_client->name))
+  {
+    thd->variables.character_set_client=
+      global_system_variables.character_set_client;
+    thd->variables.collation_connection=
+      global_system_variables.collation_connection;
+    thd->variables.character_set_results=
+      global_system_variables.character_set_results;
+  }
+  else
+  {
+    thd->variables.character_set_results=
+      thd->variables.collation_connection= 
+      thd->variables.character_set_client;
+  }
+}
+
+
 /*
     Perform handshake, authorize client and update thd ACL variables.
   SYNOPSIS
@@ -958,33 +989,7 @@ static int check_connection(THD *thd)
     thd->client_capabilities|= ((ulong) uint2korr(net->read_pos+2)) << 16;
     thd->max_client_packet_length= uint4korr(net->read_pos+4);
     DBUG_PRINT("info", ("client_character_set: %d", (uint) net->read_pos[8]));
-    /*
-      Use server character set and collation if
-      - opt_character_set_client_handshake is not set
-      - client has not specified a character set
-      - client character set is the same as the servers
-      - client character set doesn't exists in server
-    */
-    if (!opt_character_set_client_handshake ||
-        !(thd->variables.character_set_client=
-	  get_charset((uint) net->read_pos[8], MYF(0))) ||
-	!my_strcasecmp(&my_charset_latin1,
-		       global_system_variables.character_set_client->name,
-		       thd->variables.character_set_client->name))
-    {
-      thd->variables.character_set_client=
-	global_system_variables.character_set_client;
-      thd->variables.collation_connection=
-	global_system_variables.collation_connection;
-      thd->variables.character_set_results=
-	global_system_variables.character_set_results;
-    }
-    else
-    {
-      thd->variables.character_set_results=
-      thd->variables.collation_connection= 
-	thd->variables.character_set_client;
-    }
+    thd_init_client_charset(thd, (uint) net->read_pos[8]);
     thd->update_charset();
     end= (char*) net->read_pos+32;
   }
@@ -3098,6 +3103,12 @@ end_with_restore_list:
 	}
       }
       /* Don't yet allow changing of symlinks with ALTER TABLE */
+      if (lex->create_info.data_file_name)
+        push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0,
+                     "DATA DIRECTORY option ignored");
+      if (lex->create_info.index_file_name)
+        push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0,
+                     "INDEX DIRECTORY option ignored");
       lex->create_info.data_file_name=lex->create_info.index_file_name=0;
       /* ALTER TABLE ends previous transaction */
       if (end_active_trans(thd))

--- 1.16/mysql-test/r/func_sapdb.result	2005-12-02 12:01:36 +01:00
+++ 1.17/mysql-test/r/func_sapdb.result	2006-07-06 13:09:29 +02:00
@@ -81,6 +81,12 @@ makedate(1997,1)
 select makedate(1997,0);
 makedate(1997,0)
 NULL
+select makedate(9999,365);
+makedate(9999,365)
+9999-12-31
+select makedate(9999,366);
+makedate(9999,366)
+NULL
 select addtime("1997-12-31 23:59:59.999999", "1 1:1:1.000002");
 addtime("1997-12-31 23:59:59.999999", "1 1:1:1.000002")
 1998-01-02 01:01:01.000001

--- 1.98/sql-common/client.c	2006-05-12 12:32:01 +02:00
+++ 1.99/sql-common/client.c	2006-07-06 13:09:30 +02:00
@@ -125,6 +125,8 @@ static void mysql_close_free(MYSQL *mysq
 static int wait_for_data(my_socket fd, uint timeout);
 #endif
 
+CHARSET_INFO *default_client_charset_info = &my_charset_latin1;
+
 
 /****************************************************************************
   A modified version of connect().  my_connect() allows you to specify
@@ -1426,7 +1428,7 @@ mysql_init(MYSQL *mysql)
     bzero((char*) (mysql), sizeof(*(mysql)));
   mysql->options.connect_timeout= CONNECT_TIMEOUT;
   mysql->last_used_con= mysql->next_slave= mysql->master = mysql;
-  mysql->charset=default_charset_info;
+  mysql->charset=default_client_charset_info;
   strmov(mysql->net.sqlstate, not_error_sqlstate);
   /*
     By default, we are a replication pivot. The caller must reset it
@@ -1655,6 +1657,50 @@ static MYSQL_METHODS client_methods=
 #endif
 };
 
+C_MODE_START
+int mysql_init_character_set(MYSQL *mysql)
+{
+  NET		*net= &mysql->net;
+  /* Set character set */
+  if (!mysql->options.charset_name &&
+      !(mysql->options.charset_name= 
+       my_strdup(MYSQL_DEFAULT_CHARSET_NAME,MYF(MY_WME))))
+    return 1;
+  
+  {
+    const char *save= charsets_dir;
+    if (mysql->options.charset_dir)
+      charsets_dir=mysql->options.charset_dir;
+    mysql->charset=get_charset_by_csname(mysql->options.charset_name,
+                                         MY_CS_PRIMARY, MYF(MY_WME));
+    charsets_dir= save;
+  }
+  
+  if (!mysql->charset)
+  {
+    net->last_errno=CR_CANT_READ_CHARSET;
+    strmov(net->sqlstate, unknown_sqlstate);
+    if (mysql->options.charset_dir)
+      my_snprintf(net->last_error, sizeof(net->last_error)-1,
+                  ER(net->last_errno),
+                  mysql->options.charset_name,
+                  mysql->options.charset_dir);
+    else
+    {
+      char cs_dir_name[FN_REFLEN];
+      get_charsets_dir(cs_dir_name);
+      my_snprintf(net->last_error, sizeof(net->last_error)-1,
+                  ER(net->last_errno),
+                  mysql->options.charset_name,
+                  cs_dir_name);
+    }
+    return 1;
+  }
+  return 0;
+}
+C_MODE_END
+
+
 MYSQL *
 CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
 		       const char *passwd, const char *db,
@@ -1992,42 +2038,8 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,cons
     goto error;
   }
 
-  /* Set character set */
-  if (!mysql->options.charset_name &&
-      !(mysql->options.charset_name= 
-       my_strdup(MYSQL_DEFAULT_CHARSET_NAME,MYF(MY_WME))))
-    goto error;
-  
-  {
-    const char *save= charsets_dir;
-    if (mysql->options.charset_dir)
-      charsets_dir=mysql->options.charset_dir;
-    mysql->charset=get_charset_by_csname(mysql->options.charset_name,
-                                         MY_CS_PRIMARY, MYF(MY_WME));
-    charsets_dir= save;
-  }
-  
-  if (!mysql->charset)
-  {
-    net->last_errno=CR_CANT_READ_CHARSET;
-    strmov(net->sqlstate, unknown_sqlstate);
-    if (mysql->options.charset_dir)
-      my_snprintf(net->last_error, sizeof(net->last_error)-1,
-                  ER(net->last_errno),
-                  mysql->options.charset_name,
-                  mysql->options.charset_dir);
-    else
-    {
-      char cs_dir_name[FN_REFLEN];
-      get_charsets_dir(cs_dir_name);
-      my_snprintf(net->last_error, sizeof(net->last_error)-1,
-                  ER(net->last_errno),
-                  mysql->options.charset_name,
-                  cs_dir_name);
-    }
+  if (mysql_init_character_set(mysql))
     goto error;
-  }
-
 
   /* Save connection information */
   if (!my_multi_malloc(MYF(0),

--- 1.60/mysql-test/r/func_time.result	2006-07-03 17:35:53 +02:00
+++ 1.61/mysql-test/r/func_time.result	2006-07-06 13:09:29 +02:00
@@ -361,6 +361,12 @@ extract(SECOND FROM "1999-01-02 10:11:12
 select extract(MONTH FROM "2001-02-00");
 extract(MONTH FROM "2001-02-00")
 2
+SELECT DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
+DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE)
+9999-12-31 00:00:00
+SELECT DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
+DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE)
+9999-12-31 00:00:00
 SELECT EXTRACT(QUARTER FROM '2004-01-15') AS quarter;
 quarter
 1

--- 1.48/mysql-test/t/func_time.test	2006-07-03 17:35:53 +02:00
+++ 1.49/mysql-test/t/func_time.test	2006-07-06 13:09:29 +02:00
@@ -143,6 +143,10 @@ select extract(SECOND FROM "1999-01-02 1
 select extract(MONTH FROM "2001-02-00");
 
 #
+# MySQL Bugs: #12356: DATE_SUB or DATE_ADD incorrectly returns null
+#
+SELECT DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
+SELECT DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
 # test EXTRACT QUARTER (Bug #18100)
 #
 

--- 1.25/mysql-test/r/symlink.result	2006-05-11 03:16:39 +02:00
+++ 1.26/mysql-test/r/symlink.result	2006-07-06 13:09:29 +02:00
@@ -74,18 +74,24 @@ t9	CREATE TABLE `t9` (
 ) ENGINE=MyISAM AUTO_INCREMENT=16725 DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/tmp/' INDEX DIRECTORY='MYSQLTEST_VARDIR/run/'
 drop database mysqltest;
 create table t1 (a int not null) engine=myisam;
+Warnings:
+Warning	0	DATA DIRECTORY option ignored
 show create table t1;
 Table	Create Table
 t1	CREATE TABLE `t1` (
   `a` int(11) NOT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
 alter table t1 add b int;
+Warnings:
+Warning	0	DATA DIRECTORY option ignored
 show create table t1;
 Table	Create Table
 t1	CREATE TABLE `t1` (
   `a` int(11) NOT NULL,
   `b` int(11) DEFAULT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
+Warnings:
+Warning	0	INDEX DIRECTORY option ignored
 show create table t1;
 Table	Create Table
 t1	CREATE TABLE `t1` (

--- 1.114/libmysqld/lib_sql.cc	2006-04-10 18:34:07 +02:00
+++ 1.115/libmysqld/lib_sql.cc	2006-07-06 13:09:28 +02:00
@@ -37,6 +37,8 @@ extern "C"
 int check_user(THD *thd, enum enum_server_command command, 
 	       const char *passwd, uint passwd_len, const char *db,
 	       bool check_count);
+void thd_init_client_charset(THD *thd, uint cs_number);
+
 C_MODE_START
 
 #include <mysql.h>
@@ -604,11 +606,14 @@ err:
   return NULL;
 }
 
+
 #ifdef NO_EMBEDDED_ACCESS_CHECKS
 int check_embedded_connection(MYSQL *mysql)
 {
   int result;
   THD *thd= (THD*)mysql->thd;
+  thd_init_client_charset(thd, mysql->charset->number);
+  thd->update_charset();
   Security_context *sctx= thd->security_ctx;
   sctx->host_or_ip= sctx->host= (char*) my_localhost;
   strmake(sctx->priv_host, (char*) my_localhost,  MAX_HOSTNAME-1);
@@ -627,6 +632,8 @@ int check_embedded_connection(MYSQL *mys
   char scramble_buff[SCRAMBLE_LENGTH];
   int passwd_len;
 
+  thd_init_client_charset(thd, mysql->charset->number);
+  thd->update_charset();
   if (mysql->options.client_ip)
   {
     sctx->host= my_strdup(mysql->options.client_ip, MYF(0));

--- 1.68/libmysqld/libmysqld.c	2006-02-25 19:35:06 +01:00
+++ 1.69/libmysqld/libmysqld.c	2006-07-06 13:09:28 +02:00
@@ -90,49 +90,7 @@ static void end_server(MYSQL *mysql)
 }
 
 
-static int mysql_init_charset(MYSQL *mysql)
-{
-  char charset_name_buff[16], *charset_name;
-
-  if ((charset_name=mysql->options.charset_name))
-  {
-    const char *save=charsets_dir;
-    if (mysql->options.charset_dir)
-      charsets_dir=mysql->options.charset_dir;
-    mysql->charset=get_charset_by_name(mysql->options.charset_name,
-                                       MYF(MY_WME));
-    charsets_dir=save;
-  }
-  else if (mysql->server_language)
-  {
-    charset_name=charset_name_buff;
-    sprintf(charset_name,"%d",mysql->server_language);	/* In case of errors */
-    mysql->charset=get_charset((uint8) mysql->server_language, MYF(MY_WME));
-  }
-  else
-    mysql->charset=default_charset_info;
-
-  if (!mysql->charset)
-  {
-    mysql->net.last_errno=CR_CANT_READ_CHARSET;
-    strmov(mysql->net.sqlstate, "HY0000");
-    if (mysql->options.charset_dir)
-      sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
-              charset_name ? charset_name : "unknown",
-              mysql->options.charset_dir);
-    else
-    {
-      char cs_dir_name[FN_REFLEN];
-      get_charsets_dir(cs_dir_name);
-      sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
-              charset_name ? charset_name : "unknown",
-              cs_dir_name);
-    }
-    return mysql->net.last_errno;
-  }
-  return 0;
-}
-
+int mysql_init_character_set(MYSQL *mysql);
 
 MYSQL * STDCALL
 mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
@@ -222,10 +180,10 @@ mysql_real_connect(MYSQL *mysql,const ch
 
   init_embedded_mysql(mysql, client_flag, db_name);
 
-  if (check_embedded_connection(mysql))
+  if (mysql_init_character_set(mysql))
     goto error;
 
-  if (mysql_init_charset(mysql))
+  if (check_embedded_connection(mysql))
     goto error;
 
   mysql->server_status= SERVER_STATUS_AUTOCOMMIT;

--- 1.18/mysql-test/r/gis-rtree.result	2006-05-11 03:16:39 +02:00
+++ 1.19/mysql-test/r/gis-rtree.result	2006-07-06 13:09:29 +02:00
@@ -816,3 +816,43 @@ check table t1 extended;
 Table	Op	Msg_type	Msg_text
 test.t1	check	status	OK
 drop table t1;
+CREATE TABLE t1 (
+c1 geometry NOT NULL default '',
+SPATIAL KEY i1 (c1(32))
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+INSERT INTO t1 (c1) VALUES (
+PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
+                            -18.6055555000 -66.8158332999,
+                            -18.7186111000 -66.8102777000,
+                            -18.7211111000 -66.9269443999,
+                            -18.6086111000 -66.9327777000))'));
+CHECK TABLE t1 EXTENDED;
+Table	Op	Msg_type	Msg_text
+test.t1	check	status	OK
+DROP TABLE t1;
+CREATE TABLE t1 (
+c1 geometry NOT NULL default '',
+SPATIAL KEY i1 (c1(32))
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+INSERT INTO t1 (c1) VALUES (
+PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
+                            -18.6055555000 -66.8158332999,
+                            -18.7186111000 -66.8102777000,
+                            -18.7211111000 -66.9269443999,
+                            -18.6086111000 -66.9327777000))'));
+INSERT INTO t1 (c1) VALUES (
+PolygonFromText('POLYGON((-65.7402776999 -96.6686111000,
+                            -65.7372222000 -96.5516666000,
+                            -65.8502777000 -96.5461111000,
+                            -65.8527777000 -96.6627777000,
+                            -65.7402776999 -96.6686111000))'));
+INSERT INTO t1 (c1) VALUES (
+PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
+                            -18.6055555000 -66.8158332999,
+                            -18.7186111000 -66.8102777000,
+                            -18.7211111000 -66.9269443999,
+                            -18.6086111000 -66.9327777000))'));
+CHECK TABLE t1 EXTENDED;
+Table	Op	Msg_type	Msg_text
+test.t1	check	status	OK
+DROP TABLE t1;
Thread
bk commit into 5.1 tree (ingo:1.2247)ingo6 Jul