From 32a08516c974045bfc16fb30fcac18bb7ad8fbb8 Mon Sep 17 00:00:00 2001
From: unknown <bar@gw.udmsearch.izhnet.ru>
Date: Fri, 22 Feb 2002 15:24:42 +0400
Subject: Added GIS extension

BitKeeper/etc/ignore:
  Added myisam/rt_test myisam/sp_test to the ignore list
---
 sql/sql_string.cc | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

(limited to 'sql/sql_string.cc')

diff --git a/sql/sql_string.cc b/sql/sql_string.cc
index 8fe84947ac2..f0cfd590072 100644
--- a/sql/sql_string.cc
+++ b/sql/sql_string.cc
@@ -459,6 +459,44 @@ bool String::replace(uint32 offset,uint32 arg_length,const String &to)
   return FALSE;
 }
 
+// added by Holyfoot for "geometry" needs
+int String::reserve(uint32 space_needed, uint32 grow_by)
+{
+  if (Alloced_length < str_length + space_needed)
+  {
+    if (realloc(Alloced_length + max(space_needed, grow_by) - 1))
+      return TRUE;
+  }
+  return FALSE;
+}
+
+void String::qs_append(const char *str)
+{
+  int len = strlen(str);
+  memcpy(Ptr + str_length, str, len + 1);
+  str_length += len;
+}
+
+void String::qs_append(double d)
+{
+  char *buff = Ptr + str_length;
+  sprintf(buff,"%.14g", d);
+  str_length += strlen(buff);
+}
+
+void String::qs_append(double *d)
+{
+  double ld;
+  float8get(ld, d);
+  qs_append(ld);
+}
+
+void String::qs_append(const char &c)
+{
+  Ptr[str_length] = c;
+  str_length += sizeof(c);
+}
+
 
 int sortcmp(const String *x,const String *y)
 {
@@ -805,3 +843,5 @@ int wild_compare(String &match,String &wild, char escape)
   DBUG_RETURN(wild_compare(match.ptr(),match.ptr()+match.length(),
 		      wild.ptr(), wild.ptr()+wild.length(),escape));
 }
+
+
-- 
cgit v1.2.1


From 68375e0f008d109f574491bd3b0eb2184e6f3ad2 Mon Sep 17 00:00:00 2001
From: unknown <bar@gw.udmsearch.izhnet.ru>
Date: Tue, 12 Mar 2002 21:37:58 +0400
Subject: New ctype functions/macros to support many charsets at a time

client/mysql.cc:
  new ctypes
client/mysqldump.c:
  new ctypes
client/mysqltest.c:
  new ctypes
client/sql_string.cc:
  new ctypes
client/sql_string.h:
  new ctypes
extra/mysql_install.c:
  new ctypes
extra/replace.c:
  new ctypes
extra/resolve_stack_dump.c:
  new ctypes
extra/resolveip.c:
  new ctypes
heap/hp_hash.c:
  new ctypes
include/m_ctype.h:
  new ctypes
include/my_sys.h:
  new ctypes
isam/_key.c:
  new ctypes
isam/_search.c:
  new ctypes
libmysql/Makefile.shared:
  new ctypes
libmysql/libmysql.c:
  new ctypes
myisam/ft_dump.c:
  new ctypes
myisam/ft_parser.c:
  new ctypes
myisam/mi_test1.c:
  new ctypes
mysys/charset.c:
  new ctypes
mysys/default.c:
  new ctypes
mysys/getvar.c:
  new ctypes
mysys/hash.c:
  new ctypes
mysys/mf_casecnv.c:
  new ctypes
mysys/mf_dirname.c:
  new ctypes
mysys/mf_format.c:
  new ctypes
mysys/mf_iocache2.c:
  new ctypes
mysys/mf_soundex.c:
  new ctypes
mysys/mf_wfile.c:
  new ctypes
mysys/my_error.c:
  new ctypes
mysys/my_getwd.c:
  new ctypes
mysys/my_init.c:
  new ctypes
mysys/my_vsnprintf.c:
  new ctypes
mysys/typelib.c:
  new ctypes
sql/convert.cc:
  new ctypes
sql/des_key_file.cc:
  new ctypes
sql/field.cc:
  new ctypes
sql/field.h:
  new ctypes
sql/field_conv.cc:
  new ctypes
sql/filesort.cc:
  new ctypes
sql/ha_innodb.cc:
  new ctypes
sql/hostname.cc:
  new ctypes
sql/init.cc:
  new ctypes
sql/item.cc:
  new ctypes
sql/item_func.cc:
  new ctypes
sql/item_strfunc.cc:
  new ctypes
sql/item_sum.cc:
  new ctypes
sql/item_timefunc.cc:
  new ctypes
sql/key.cc:
  new ctypes
sql/log.cc:
  new ctypes
sql/mysql_priv.h:
  new ctypes
sql/mysqld.cc:
  new ctypes
sql/opt_range.cc:
  new ctypes
sql/procedure.cc:
  new ctypes
sql/slave.cc:
  new ctypes
sql/sql_acl.cc:
  new ctypes
sql/sql_analyse.cc:
  new ctypes
sql/sql_base.cc:
  new ctypes
sql/sql_cache.cc:
  new ctypes
sql/sql_db.cc:
  new ctypes
sql/sql_handler.cc:
  new ctypes
sql/sql_lex.cc:
  new ctypes
sql/sql_parse.cc:
  new ctypes
sql/sql_show.cc:
  new ctypes
sql/sql_string.cc:
  new ctypes
sql/sql_string.h:
  new ctypes
sql/sql_table.cc:
  new ctypes
sql/sql_yacc.yy:
  new ctypes
sql/table.cc:
  new ctypes
sql/time.cc:
  new ctypes
strings/Makefile.am:
  new ctypes
strings/ctype-big5.c:
  new ctypes
strings/ctype-czech.c:
  new ctypes
strings/ctype-gbk.c:
  new ctypes
strings/ctype-latin1_de.c:
  new ctypes
strings/ctype-sjis.c:
  new ctypes
strings/ctype-tis620.c:
  new ctypes
strings/ctype.c:
  new ctypes
strings/str2int.c:
  new ctypes
strings/strto.c:
  new ctypes
tools/mysqlmanager.c:
  new ctypes
---
 sql/sql_string.cc | 74 ++++++++++++++++++++++++++++---------------------------
 1 file changed, 38 insertions(+), 36 deletions(-)

(limited to 'sql/sql_string.cc')

diff --git a/sql/sql_string.cc b/sql/sql_string.cc
index f0cfd590072..62b1812afb3 100644
--- a/sql/sql_string.cc
+++ b/sql/sql_string.cc
@@ -234,7 +234,7 @@ bool String::fill(uint32 max_length,char fill_char)
 
 void String::strip_sp()
 {
-   while (str_length && isspace(Ptr[str_length-1]))
+   while (str_length && my_isspace(str_charset,Ptr[str_length-1]))
     str_length--;
 }
 
@@ -296,10 +296,10 @@ uint32 String::numchars()
   register uint32 n=0,mblen;
   register const char *mbstr=Ptr;
   register const char *end=mbstr+str_length;
-  if (use_mb(default_charset_info))
+  if (use_mb(str_charset))
   {
     while (mbstr < end) {
-        if ((mblen=my_ismbchar(default_charset_info, mbstr,end))) mbstr+=mblen;
+        if ((mblen=my_ismbchar(str_charset, mbstr,end))) mbstr+=mblen;
         else ++mbstr;
         ++n;
     }
@@ -316,11 +316,11 @@ int String::charpos(int i,uint32 offset)
   register uint32 mblen;
   register const char *mbstr=Ptr+offset;
   register const char *end=Ptr+str_length;
-  if (use_mb(default_charset_info))
+  if (use_mb(str_charset))
   {
     if (i<=0) return i;
     while (i && mbstr < end) {
-       if ((mblen=my_ismbchar(default_charset_info, mbstr,end))) mbstr+=mblen;
+       if ((mblen=my_ismbchar(str_charset, mbstr,end))) mbstr+=mblen;
        else ++mbstr;
        --i;
     }
@@ -380,12 +380,14 @@ int String::strstr_case(const String &s,uint32 offset)
 skipp:
     while (str != end)
     {
-      if (my_sort_order[*str++] == my_sort_order[*search])
+      if (str_charset->sort_order[*str++] == str_charset->sort_order[*search])
       {
 	register char *i,*j;
 	i=(char*) str; j=(char*) search+1;
 	while (j != search_end)
-	  if (my_sort_order[*i++] != my_sort_order[*j++]) goto skipp;
+	  if (str_charset->sort_order[*i++] != 
+              str_charset->sort_order[*j++]) 
+            goto skipp;
 	return (int) (str-Ptr) -1;
       }
     }
@@ -505,15 +507,15 @@ int sortcmp(const String *x,const String *y)
   uint32 x_len=x->length(),y_len=y->length(),len=min(x_len,y_len);
 
 #ifdef USE_STRCOLL
-  if (use_strcoll(default_charset_info))
+  if (use_strcoll(x->str_charset))
   {
 #ifndef CMP_ENDSPACE
-    while (x_len && isspace(s[x_len-1]))
+    while (x_len && my_isspace(x->str_charset,s[x_len-1]))
       x_len--;
-    while (y_len && isspace(t[y_len-1]))
+    while (y_len && my_isspace(x->str_charset,t[y_len-1]))
       y_len--;
 #endif
-    return my_strnncoll(default_charset_info,
+    return my_strnncoll(x->str_charset,
                         (unsigned char *)s,x_len,(unsigned char *)t,y_len);
   }
   else
@@ -523,9 +525,10 @@ int sortcmp(const String *x,const String *y)
     y_len-=len;
     while (len--)
     {
-      if (my_sort_order[(uchar) *s++] != my_sort_order[(uchar) *t++])
-        return ((int) my_sort_order[(uchar) s[-1]] -
-                (int) my_sort_order[(uchar) t[-1]]);
+      if (x->str_charset->sort_order[(uchar) *s++] != 
+          x->str_charset->sort_order[(uchar) *t++])
+        return ((int) x->str_charset->sort_order[(uchar) s[-1]] -
+                (int) x->str_charset->sort_order[(uchar) t[-1]]);
     }
 #ifndef CMP_ENDSPACE
     /* Don't compare end space in strings */
@@ -534,14 +537,14 @@ int sortcmp(const String *x,const String *y)
       {
         const char *end=t+y_len;
         for (; t != end ; t++)
-          if (!isspace(*t))
+          if (!my_isspace(x->str_charset,*t))
             return -1;
       }
       else
       {
         const char *end=s+x_len;
         for (; s != end ; s++)
-          if (!isspace(*s))
+          if (!my_isspace(x->str_charset,*s))
             return 1;
       }
       return 0;
@@ -589,11 +592,10 @@ String *copy_if_not_alloced(String *to,String *from,uint32 from_length)
 /* Make it easier to handle different charactersets */
 
 #ifdef USE_MB
-#define INC_PTR(A,B) A+=((use_mb_flag && \
-                          my_ismbchar(default_charset_info,A,B)) ? \
-                          my_ismbchar(default_charset_info,A,B) : 1)
+#define INC_PTR(cs,A,B) A+=((use_mb_flag && \
+                          my_ismbchar(cs,A,B)) ? my_ismbchar(cs,A,B) : 1)
 #else
-#define INC_PTR(A,B) A++
+#define INC_PTR(cs,A,B) A++
 #endif
 
 /*
@@ -604,12 +606,12 @@ String *copy_if_not_alloced(String *to,String *from,uint32 from_length)
 */
 
 #ifdef LIKE_CMP_TOUPPER
-#define likeconv(A) (uchar) toupper(A)
+#define likeconv(s,A) (uchar) my_toupper(s,A)
 #else
-#define likeconv(A) (uchar) my_sort_order[(uchar) (A)]
+#define likeconv(s,A) (uchar) (s)->sort_order[(uchar) (A)]
 #endif
 
-int wild_case_compare(const char *str,const char *str_end,
+int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *str_end,
 		      const char *wildstr,const char *wildend,
 		      char escape)
 {
@@ -626,7 +628,7 @@ int wild_case_compare(const char *str,const char *str_end,
 #ifdef USE_MB
       int l;
       if (use_mb_flag &&
-          (l = my_ismbchar(default_charset_info, wildstr, wildend)))
+          (l = my_ismbchar(cs, wildstr, wildend)))
       {
 	  if (str+l > str_end || memcmp(str, wildstr, l) != 0)
 	      return 1;
@@ -635,7 +637,7 @@ int wild_case_compare(const char *str,const char *str_end,
       }
       else
 #endif
-      if (str == str_end || likeconv(*wildstr++) != likeconv(*str++))
+      if (str == str_end || likeconv(cs,*wildstr++) != likeconv(cs,*str++))
 	return(1);				// No match
       if (wildstr == wildend)
 	return (str != str_end);		// Match if both are at end
@@ -647,7 +649,7 @@ int wild_case_compare(const char *str,const char *str_end,
       {
 	if (str == str_end)			// Skip one char if possible
 	  return (result);
-	INC_PTR(str,str_end);
+	INC_PTR(cs,str,str_end);
       } while (++wildstr < wildend && *wildstr == wild_one);
       if (wildstr == wildend)
 	break;
@@ -664,7 +666,7 @@ int wild_case_compare(const char *str,const char *str_end,
 	{
 	  if (str == str_end)
 	    return (-1);
-	  INC_PTR(str,str_end);
+	  INC_PTR(cs,str,str_end);
 	  continue;
 	}
 	break;					// Not a wild character
@@ -682,10 +684,10 @@ int wild_case_compare(const char *str,const char *str_end,
       int mblen;
       LINT_INIT(mblen);
       if (use_mb_flag)
-        mblen = my_ismbchar(default_charset_info, wildstr, wildend);
+        mblen = my_ismbchar(cs, wildstr, wildend);
 #endif
-      INC_PTR(wildstr,wildend);			// This is compared trough cmp
-      cmp=likeconv(cmp);   
+      INC_PTR(cs,wildstr,wildend);		// This is compared trough cmp
+      cmp=likeconv(cs,cmp);   
       do
       {
 #ifdef USE_MB
@@ -703,26 +705,26 @@ int wild_case_compare(const char *str,const char *str_end,
                 break;
               }
             }
-            else if (!my_ismbchar(default_charset_info, str, str_end) &&
-                     likeconv(*str) == cmp)
+            else if (!my_ismbchar(cs, str, str_end) &&
+                     likeconv(cs,*str) == cmp)
             {
               str++;
               break;
             }
-            INC_PTR(str, str_end);
+            INC_PTR(cs,str, str_end);
           }
 	}
         else
         {
 #endif /* USE_MB */
-          while (str != str_end && likeconv(*str) != cmp)
+          while (str != str_end && likeconv(cs,*str) != cmp)
             str++;
           if (str++ == str_end) return (-1);
 #ifdef USE_MB
         }
 #endif
 	{
-	  int tmp=wild_case_compare(str,str_end,wildstr,wildend,escape);
+	  int tmp=wild_case_compare(cs,str,str_end,wildstr,wildend,escape);
 	  if (tmp <= 0)
 	    return (tmp);
 	}
@@ -739,7 +741,7 @@ int wild_case_compare(String &match,String &wild, char escape)
   DBUG_ENTER("wild_case_compare");
   DBUG_PRINT("enter",("match='%s', wild='%s', escape='%c'"
 			  ,match.ptr(),wild.ptr(),escape));
-  DBUG_RETURN(wild_case_compare(match.ptr(),match.ptr()+match.length(),
+  DBUG_RETURN(wild_case_compare(match.str_charset,match.ptr(),match.ptr()+match.length(),
 			   wild.ptr(), wild.ptr()+wild.length(),escape));
 }
 
-- 
cgit v1.2.1


From ee1ef8c58c9df9a62f7a0cc3dee6c2f705c8eb44 Mon Sep 17 00:00:00 2001
From: unknown <bar@gw.udmsearch.izhnet.ru>
Date: Thu, 14 Mar 2002 20:52:48 +0400
Subject: use String->charset instead of default_charset_info

client/mysql.cc:
  default_charset_info -> system_charset_info
include/m_ctype.h:
  Remove old ctype
mysys/charset.c:
  Initialize fields after dynamic charset loading
sql/sql_parse.cc:
  default_charset_info -> system_charset_info
---
 sql/sql_string.cc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'sql/sql_string.cc')

diff --git a/sql/sql_string.cc b/sql/sql_string.cc
index 62b1812afb3..cf9e9f62507 100644
--- a/sql/sql_string.cc
+++ b/sql/sql_string.cc
@@ -617,7 +617,7 @@ int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *str_end,
 {
   int result= -1;				// Not found, using wildcards
 #ifdef USE_MB
-  bool use_mb_flag=use_mb(default_charset_info);
+  bool use_mb_flag=use_mb(cs);
 #endif
   while (wildstr != wildend)
   {
-- 
cgit v1.2.1


From 8bee96ab0ad02e45bb4652f6878173d030642051 Mon Sep 17 00:00:00 2001
From: unknown <bar@gw.udmsearch.izhnet.ru>
Date: Fri, 17 May 2002 16:29:52 +0500
Subject: Now string values are created and filled with charset field SELECT
 func(charset2) FROM t ORDER BY 1 works in correct charset

---
 sql/sql_string.cc | 1 +
 1 file changed, 1 insertion(+)

(limited to 'sql/sql_string.cc')

diff --git a/sql/sql_string.cc b/sql/sql_string.cc
index cf9e9f62507..b222d3394eb 100644
--- a/sql/sql_string.cc
+++ b/sql/sql_string.cc
@@ -586,6 +586,7 @@ String *copy_if_not_alloced(String *to,String *from,uint32 from_length)
     return from;				// Actually an error
   if ((to->str_length=min(from->str_length,from_length)))
     memcpy(to->Ptr,from->Ptr,to->str_length);
+  to->str_charset=from->str_charset;
   return to;
 }
 
-- 
cgit v1.2.1


From 1b49cd8ca1391d5141750fae62fa0c9c13da6e86 Mon Sep 17 00:00:00 2001
From: unknown <bar@gw.udmsearch.izhnet.ru>
Date: Mon, 20 May 2002 21:56:27 +0500
Subject: Bug fix: charset was not initialized

---
 sql/sql_string.cc | 1 +
 1 file changed, 1 insertion(+)

(limited to 'sql/sql_string.cc')

diff --git a/sql/sql_string.cc b/sql/sql_string.cc
index b222d3394eb..c05a7b85f77 100644
--- a/sql/sql_string.cc
+++ b/sql/sql_string.cc
@@ -203,6 +203,7 @@ bool String::copy(const String &str)
   str_length=str.str_length;
   bmove(Ptr,str.Ptr,str_length);		// May be overlapping
   Ptr[str_length]=0;
+  str_charset=str.str_charset;
   return FALSE;
 }
 
-- 
cgit v1.2.1


From e494b724d0b3100d325a6dd9f59c004b3bb71c1c Mon Sep 17 00:00:00 2001
From: unknown <monty@hundin.mysql.fi>
Date: Wed, 22 May 2002 20:09:03 +0300
Subject: Fixed key algorithm handling

sql/sql_string.cc:
  Portability fix
---
 sql/sql_string.cc | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'sql/sql_string.cc')

diff --git a/sql/sql_string.cc b/sql/sql_string.cc
index c05a7b85f77..b8e2ba7b536 100644
--- a/sql/sql_string.cc
+++ b/sql/sql_string.cc
@@ -123,7 +123,7 @@ bool String::set(double num,uint decimals)
   char *pos,*to;
 
   VOID(fconvert(num,(int) decimals,&decpt,&sign,buff+1));
-  if (!isdigit(buff[1]))
+  if (!my_isdigit(system_charset_info, buff[1]))
   {						// Nan or Inf
     pos=buff+1;
     if (sign)
@@ -490,7 +490,7 @@ void String::qs_append(double d)
 void String::qs_append(double *d)
 {
   double ld;
-  float8get(ld, d);
+  float8get(ld, (char*) d);
   qs_append(ld);
 }
 
-- 
cgit v1.2.1