summaryrefslogtreecommitdiff
path: root/sql/item_strfunc.cc
diff options
context:
space:
mode:
authormonty@narttu.mysql.fi <>2003-05-19 16:35:49 +0300
committermonty@narttu.mysql.fi <>2003-05-19 16:35:49 +0300
commitdd2b7918cdd5e0e643cff0305542ccd4aa8f1b6b (patch)
tree6025913cf3d482ba0783bf3420f7341c10cd574a /sql/item_strfunc.cc
parent524878e9358706ffb5908677c746a9060c66ad32 (diff)
parentfc0df599dc72408419e80a5f1d3e07dc5f0fec88 (diff)
downloadmariadb-git-dd2b7918cdd5e0e643cff0305542ccd4aa8f1b6b.tar.gz
Merge with 4.0.13
Diffstat (limited to 'sql/item_strfunc.cc')
-rw-r--r--sql/item_strfunc.cc21
1 files changed, 10 insertions, 11 deletions
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 6118b25a88c..d28341c3bd0 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -27,9 +27,6 @@
#include "mysql_priv.h"
#include "sql_acl.h"
#include <m_ctype.h>
-#ifdef HAVE_CRYPT_H
-#include <crypt.h>
-#endif
#ifdef HAVE_OPENSSL
#include <openssl/des.h>
#endif /* HAVE_OPENSSL */
@@ -925,7 +922,7 @@ void Item_str_func::left_right_max_length()
max_length=args[0]->max_length;
if (args[1]->const_item())
{
- int length=(int) args[1]->val_int();
+ int length=(int) args[1]->val_int()*default_charset_info->mbmaxlen;
if (length <= 0)
max_length=0;
else
@@ -1006,7 +1003,7 @@ void Item_func_substr::fix_length_and_dec()
}
if (arg_count == 3 && args[2]->const_item())
{
- int32 length= (int32) args[2]->val_int();
+ int32 length= (int32) args[2]->val_int() * default_charset_info->mbmaxlen;
if (length <= 0)
max_length=0; /* purecov: inspected */
else
@@ -1585,15 +1582,17 @@ String *Item_func_format::val_str(String *str)
str_length=str->length();
if (nr < 0)
str_length--; // Don't count sign
- length=str->length()+(diff=(str_length- dec-1)/3);
- if (diff)
+
+ /* We need this test to handle 'nan' values */
+ if (str_length >= dec+4)
{
char *tmp,*pos;
- str=copy_if_not_alloced(&tmp_str,str,length);
+ length= str->length()+(diff=(str_length- dec-1)/3);
+ str= copy_if_not_alloced(&tmp_str,str,length);
str->length(length);
- tmp=(char*) str->ptr()+length - dec-1;
- for (pos=(char*) str->ptr()+length ; pos != tmp; pos--)
- pos[0]=pos[- (int) diff];
+ tmp= (char*) str->ptr()+length - dec-1;
+ for (pos= (char*) str->ptr()+length ; pos != tmp; pos--)
+ pos[0]= pos[-(int) diff];
while (diff)
{
pos[0]=pos[-(int) diff]; pos--;