List:Commits« Previous MessageNext Message »
From:kroki Date:June 22 2006 3:15pm
Subject:bk commit into 5.0 tree (kroki:1.2168) BUG#15811
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of tomash. When tomash 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.2168 06/06/22 19:15:03 kroki@stripped +1 -0
  Bug#15811: extremely long time for mysql client to execute long INSERT
  
  The problem was in redundant calls to strlen() in string functions,
  where we may then return after checking only the small number of characters.
  
  No test case is provided since it's a performance fix.

  strings/ctype-mb.c
    1.48 06/06/22 19:14:57 kroki@stripped +12 -8
    Do not use strlen() where arbitrary horizon of at least
    CHARSET_INFO::mbmaxlen character is sufficient.

# 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:	kroki
# Host:	moonlight.intranet
# Root:	/home/tomash/src/mysql_ab/mysql-5.0-bug15811

--- 1.47/strings/ctype-mb.c	2005-10-06 16:40:13 +04:00
+++ 1.48/strings/ctype-mb.c	2006-06-22 19:14:57 +04:00
@@ -24,12 +24,12 @@
 void my_caseup_str_mb(CHARSET_INFO * cs, char *str)
 {
   register uint32 l;
-  register char *end=str+strlen(str); /* BAR TODO: remove strlen() call */
   register uchar *map=cs->to_upper;
   
   while (*str)
   {
-    if ((l=my_ismbchar(cs, str,end)))
+    /* Pointing after the '\0' is safe here. */
+    if ((l=my_ismbchar(cs, str, str + cs->mbmaxlen)))
       str+=l;
     else
     { 
@@ -42,12 +42,12 @@
 void my_casedn_str_mb(CHARSET_INFO * cs, char *str)
 {
   register uint32 l;
-  register char *end=str+strlen(str);
   register uchar *map=cs->to_lower;
   
   while (*str)
   {
-    if ((l=my_ismbchar(cs, str,end)))
+    /* Pointing after the '\0' is safe here. */
+    if ((l=my_ismbchar(cs, str, str + cs->mbmaxlen)))
       str+=l;
     else
     {
@@ -101,15 +101,18 @@
   return srclen;
 }
 
+/*
+  my_strcasecmp_mb() returns 0 if strings are equal, non-zero otherwise.
+ */
 int my_strcasecmp_mb(CHARSET_INFO * cs,const char *s, const char *t)
 {
   register uint32 l;
-  register const char *end=s+strlen(s);
   register uchar *map=cs->to_upper;
   
-  while (s<end)
+  while (*s && *t)
   {
-    if ((l=my_ismbchar(cs, s,end)))
+    /* Pointing after the '\0' is safe here. */
+    if ((l=my_ismbchar(cs, s, s + cs->mbmaxlen)))
     {
       while (l--)
         if (*s++ != *t++) 
@@ -120,7 +123,8 @@
     else if (map[(uchar) *s++] != map[(uchar) *t++])
       return 1;
   }
-  return *t;
+  /* At least one of '*s' and '*t' is zero here. */
+  return (*t != *s);
 }
 
 
Thread
bk commit into 5.0 tree (kroki:1.2168) BUG#15811kroki22 Jun