[前][次][番号順一覧][スレッド一覧]

mysql:3623

From: <takeshi@xxxxxxxxxx>
Date: Thu, 10 May 2001 00:39:30 +0900
Subject: [mysql 03623] Re: REPLACE 関数の問題

At Wed, 09 May 2001 17:44:52 +0900,
Akihiko Shinohara wrote:

> どうも、REPLACE関数がうまく動かないようです。
> 
> | mysql> select replace('abcd','a','b');
> | +-------------------------+
> | | replace('abcd','a','b') |
> | +-------------------------+
> | | bbcd                    |
> | +-------------------------+
> | 1 row in set (0.00 sec)
> |
> | mysql> select replace('abcd','a','ab');
> 
> これを実行すると、サーバからレスポンスが得られません。
> サーバ内で無限ループに陥っている感じです。

MultiBytes の場合おこるようです。とりあえずのパッチです

diff -ru mysql-3.23.37.orig/sql/item_strfunc.cc mysql-3.23.37/sql/item_strfunc.cc
--- mysql-3.23.37.orig/sql/item_strfunc.cc	Wed Apr 18 17:45:53 2001
+++ mysql-3.23.37/sql/item_strfunc.cc	Thu May 10 00:35:26 2001
@@ -393,12 +393,14 @@
 String *Item_func_replace::val_str(String *str)
 {
   String *res,*res2,*res3;
-  int offset=0;
+  int offset;
   uint from_length,to_length;
   bool alloced=0;
 #ifdef USE_MB
   const char *ptr,*end,*strend,*search,*search_end;
   register uint32 l;
+  bool binary_str = (args[0]->binary || args[1]->binary ||
+		     !use_mb(default_charset_info));
 #endif
 
   null_value=0;
@@ -415,7 +417,8 @@
   if ((offset=res->strstr(*res2)) < 0)
     return res;
 #else
-  if (!use_mb(default_charset_info) && (offset=res->strstr(*res2)) < 0)
+  offset=0;
+  if (binary_str && (offset=res->strstr(*res2)) < 0)
     return res;
 #endif
   if (!(res3=args[2]->val_str(&tmp_value2)))
@@ -424,7 +427,7 @@
   to_length=   res3->length();
 
 #ifdef USE_MB
-  if (use_mb(default_charset_info))
+  if (!binary_str)
   {
     search=res2->ptr();
     search_end=search+from_length;
@@ -449,6 +452,7 @@
             res=copy_if_not_alloced(str,res,res->length()+to_length);
           }
           res->replace((uint) offset,from_length,*res3);
+	  offset+=(int) to_length;
           goto redo;
         }
 skipp:

-- 
 村上 毅  takeshi@xxxxxxxxxx
 Soft Agency Co., Ltd. TEL +81-48-661-1527
 PGP fingerprint = 45 5D 54 12 B4 55 77 7F  D4 52 66 EC 03 3F 1B E9

[前][次][番号順一覧][スレッド一覧]

      3619 2001-05-09 17:44 [Akihiko Shinohara <s] REPLACE 関数の問題                      
      3620 2001-05-09 18:21 ┣[Seiji Tateyama <tate]                                       
->    3623 2001-05-10 00:39 ┗[<takeshi@xxxxxxxxxx>]                                       
      3624 2001-05-10 10:44  ┗[Akihiko Shinohara <s]