summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bar@bar.mysql.r18.ru>2003-01-16 17:17:07 +0400
committerunknown <bar@bar.mysql.r18.ru>2003-01-16 17:17:07 +0400
commit4bd6c3564fa713ffd2ac63f4810b04b8589c042e (patch)
tree63655aa98b051bb33cac94c520aec58962c9252b
parentdf1a1075dd8cb63834f450ad91649eadfbc3e58f (diff)
downloadmariadb-git-4bd6c3564fa713ffd2ac63f4810b04b8589c042e.tar.gz
strnto family functions now return error in a new argument
-rw-r--r--include/m_ctype.h30
-rw-r--r--libmysql/libmysql.c13
-rw-r--r--sql/field.cc91
-rw-r--r--sql/item.cc14
-rw-r--r--sql/item.h14
-rw-r--r--sql/item_func.h6
-rw-r--r--sql/item_strfunc.cc11
-rw-r--r--sql/item_sum.cc3
-rw-r--r--sql/item_sum.h6
-rw-r--r--sql/mysqld.cc3
-rw-r--r--sql/procedure.h10
-rw-r--r--strings/ctype-simple.c32
-rw-r--r--strings/ctype-utf8.c48
-rw-r--r--strings/ctype.c10
14 files changed, 166 insertions, 125 deletions
diff --git a/include/m_ctype.h b/include/m_ctype.h
index cd6bfc15f8a..8e3cffc5613 100644
--- a/include/m_ctype.h
+++ b/include/m_ctype.h
@@ -138,11 +138,11 @@ typedef struct charset_info_st
int (*longlong10_to_str)(struct charset_info_st *, char *to, uint n, int radix, longlong val);
/* String-to-number convertion routines */
- long (*strntol)(struct charset_info_st *, const char *s, uint l,char **e, int base);
- ulong (*strntoul)(struct charset_info_st *, const char *s, uint l, char **e, int base);
- longlong (*strntoll)(struct charset_info_st *, const char *s, uint l, char **e, int base);
- ulonglong (*strntoull)(struct charset_info_st *, const char *s, uint l, char **e, int base);
- double (*strntod)(struct charset_info_st *, char *s, uint l, char **e);
+ long (*strntol)(struct charset_info_st *, const char *s, uint l, int base, char **e, int *err);
+ ulong (*strntoul)(struct charset_info_st *, const char *s, uint l, int base, char **e, int *err);
+ longlong (*strntoll)(struct charset_info_st *, const char *s, uint l, int base, char **e, int *err);
+ ulonglong (*strntoull)(struct charset_info_st *, const char *s, uint l, int base, char **e, int *err);
+ double (*strntod)(struct charset_info_st *, char *s, uint l, char **e, int *err);
} CHARSET_INFO;
@@ -183,11 +183,11 @@ int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e);
int my_snprintf_8bit(struct charset_info_st *, char *to, uint n, const char *fmt, ...);
-long my_strntol_8bit(CHARSET_INFO *, const char *s, uint l,char **e, int base);
-ulong my_strntoul_8bit(CHARSET_INFO *, const char *s, uint l,char **e, int base);
-longlong my_strntoll_8bit(CHARSET_INFO *, const char *s, uint l,char **e, int base);
-ulonglong my_strntoull_8bit(CHARSET_INFO *, const char *s, uint l,char **e, int base);
-double my_strntod_8bit(CHARSET_INFO *, char *s, uint l,char **e);
+long my_strntol_8bit(CHARSET_INFO *, const char *s, uint l, int base, char **e, int *err);
+ulong my_strntoul_8bit(CHARSET_INFO *, const char *s, uint l, int base, char **e, int *err);
+longlong my_strntoll_8bit(CHARSET_INFO *, const char *s, uint l, int base, char **e, int *err);
+ulonglong my_strntoull_8bit(CHARSET_INFO *, const char *s, uint l, int base, char **e, int *err);
+double my_strntod_8bit(CHARSET_INFO *, char *s, uint l,char **e, int *err);
int my_long10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix, long int val);
int my_longlong10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix, longlong val);
@@ -274,11 +274,11 @@ int my_wildcmp_mb(CHARSET_INFO *,
#define my_strcasecmp(s, a, b) ((s)->strcasecmp((s), (a), (b)))
#define my_strncasecmp(s, a, b, l) ((s)->strncasecmp((s), (a), (b), (l)))
-#define my_strntol(s, a, b, c, d) ((s)->strntol((s),(a),(b),(c),(d)))
-#define my_strntoul(s, a, b, c, d) ((s)->strntoul((s),(a),(b),(c),(d)))
-#define my_strntoll(s, a, b, c, d) ((s)->strntoll((s),(a),(b),(c),(d)))
-#define my_strntoull(s, a, b, c,d) ((s)->strntoull((s),(a),(b),(c),(d)))
-#define my_strntod(s, a, b, c ) ((s)->strntod((s),(a),(b),(c)))
+#define my_strntol(s, a, b, c, d, e) ((s)->strntol((s),(a),(b),(c),(d),(e)))
+#define my_strntoul(s, a, b, c, d, e) ((s)->strntoul((s),(a),(b),(c),(d),(e)))
+#define my_strntoll(s, a, b, c, d, e) ((s)->strntoll((s),(a),(b),(c),(d),(e)))
+#define my_strntoull(s, a, b, c,d, e) ((s)->strntoull((s),(a),(b),(c),(d),(e)))
+#define my_strntod(s, a, b, c, d) ((s)->strntod((s),(a),(b),(c),(d)))
/* XXX: still need to take care of this one */
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index 7757050aad7..7c4f6acfa07 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -4522,41 +4522,42 @@ static void send_data_double(MYSQL_BIND *param, double value)
static void send_data_str(MYSQL_BIND *param, char *value, uint length)
{
char *buffer= param->buffer;
+ int err=0;
switch(param->buffer_type) {
case MYSQL_TYPE_TINY:
{
- uchar data= (uchar)my_strntol(system_charset_info,value,length,NULL,10);
+ uchar data= (uchar)my_strntol(system_charset_info,value,length,10,NULL,&err);
*buffer= data;
break;
}
case MYSQL_TYPE_SHORT:
{
- short data= (short)my_strntol(system_charset_info,value,length,NULL,10);
+ short data= (short)my_strntol(system_charset_info,value,length,10,NULL,&err);
int2store(buffer, data);
break;
}
case MYSQL_TYPE_LONG:
{
- int32 data= (int32)my_strntol(system_charset_info,value,length,NULL,10);
+ int32 data= (int32)my_strntol(system_charset_info,value,length,10,NULL,&err);
int4store(buffer, data);
break;
}
case MYSQL_TYPE_LONGLONG:
{
- longlong data= my_strntoll(system_charset_info,value,length,NULL,10);
+ longlong data= my_strntoll(system_charset_info,value,length,10,NULL,&err);
int8store(buffer, data);
break;
}
case MYSQL_TYPE_FLOAT:
{
- float data = (float)my_strntod(system_charset_info,value,length,NULL);
+ float data = (float)my_strntod(system_charset_info,value,length,NULL,&err);
float4store(buffer, data);
break;
}
case MYSQL_TYPE_DOUBLE:
{
- double data= my_strntod(system_charset_info,value,length,NULL);
+ double data= my_strntod(system_charset_info,value,length,NULL,&err);
float8store(buffer, data);
break;
}
diff --git a/sql/field.cc b/sql/field.cc
index 0ba2bbc5aa1..c287c716cc1 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -840,15 +840,17 @@ int Field_decimal::store(longlong nr)
double Field_decimal::val_real(void)
{
- return my_strntod(my_charset_bin, ptr, field_length, NULL);
+ int err;
+ return my_strntod(my_charset_bin, ptr, field_length, NULL, &err);
}
longlong Field_decimal::val_int(void)
{
+ int err;
if (unsigned_flag)
- return my_strntoull(my_charset_bin, ptr, field_length, NULL, 10);
+ return my_strntoull(my_charset_bin, ptr, field_length, 10, NULL, &err);
else
- return my_strntoll( my_charset_bin, ptr, field_length, NULL, 10);
+ return my_strntoll( my_charset_bin, ptr, field_length, 10, NULL, &err);
}
@@ -950,8 +952,9 @@ void Field_decimal::sql_type(String &res) const
int Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs)
{
+ int err;
char *end;
- long tmp= my_strntol(cs, from, len, &end,10);
+ long tmp= my_strntol(cs, from, len, 10, &end, &err);
int error= 0;
if (unsigned_flag)
@@ -1151,8 +1154,9 @@ void Field_tiny::sql_type(String &res) const
int Field_short::store(const char *from,uint len,CHARSET_INFO *cs)
{
+ int err;
char *end;
- long tmp= my_strntol(cs, from, len, &end, 10);
+ long tmp= my_strntol(cs, from, len, 10, &end, &err);
int error= 0;
if (unsigned_flag)
{
@@ -1423,8 +1427,9 @@ void Field_short::sql_type(String &res) const
int Field_medium::store(const char *from,uint len,CHARSET_INFO *cs)
{
+ int err;
char *end;
- long tmp= my_strntol(cs, from, len, &end, 10);
+ long tmp= my_strntol(cs, from, len, 10, &end, &err);
int error= 0;
if (unsigned_flag)
@@ -1659,16 +1664,15 @@ int Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
error= 1;
}
else
- tmp=(long) my_strntoul(cs,from,len,&end,10);
+ tmp=(long) my_strntoul(cs,from,len,10,&end,&error);
}
else
- tmp=my_strntol(cs,from,len,&end,10);
- if (my_errno ||
+ tmp=my_strntol(cs,from,len,10,&end,&error);
+ if (error ||
(from+len != end && current_thd->count_cuted_fields &&
!test_if_int(from,len,end,cs)))
{
current_thd->cuted_fields++;
- error= 1;
}
#ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first)
@@ -1918,11 +1922,11 @@ int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs)
error= 1;
}
else
- tmp=(longlong) my_strntoull(cs,from,len,&end,10);
+ tmp=(longlong) my_strntoull(cs,from,len,10,&end,&error);
}
else
- tmp=my_strntoll(cs,from,len,&end,10);
- if (my_errno ||
+ tmp=my_strntoll(cs,from,len,10,&end,&error);
+ if (error ||
(from+len != end && current_thd->count_cuted_fields &&
!test_if_int(from,len,end,cs)))
current_thd->cuted_fields++;
@@ -2130,14 +2134,14 @@ void Field_longlong::sql_type(String &res) const
int Field_float::store(const char *from,uint len,CHARSET_INFO *cs)
{
- errno=0; // my_strntod() changes errno
- Field_float::store(my_strntod(cs,(char*) from,len,(char**)NULL));
- if (errno || current_thd->count_cuted_fields && !test_if_real(from,len,cs))
+ int err=0;
+ Field_float::store(my_strntod(cs,(char*) from,len,(char**)NULL,&err));
+ if (err || current_thd->count_cuted_fields && !test_if_real(from,len,cs))
{
current_thd->cuted_fields++;
return 1;
}
- return (errno) ? 1 : 0;
+ return (err) ? 1 : 0;
}
@@ -2403,19 +2407,17 @@ void Field_float::sql_type(String &res) const
int Field_double::store(const char *from,uint len,CHARSET_INFO *cs)
{
- errno=0; // my_strntod() changes errno
- int error= 0;
- double j= my_strntod(cs,(char*) from,len,(char**)0);
- if (errno || current_thd->count_cuted_fields && !test_if_real(from,len,cs))
+ int err= 0;
+ double j= my_strntod(cs,(char*) from,len,(char**)0,&err);
+ if (err || current_thd->count_cuted_fields && !test_if_real(from,len,cs))
{
current_thd->cuted_fields++;
- error= 1;
}
if (unsigned_flag && j < 0)
{
current_thd->cuted_fields++;
j=0;
- error= 1;
+ err= 1;
}
#ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first)
@@ -2425,7 +2427,7 @@ int Field_double::store(const char *from,uint len,CHARSET_INFO *cs)
else
#endif
doublestore(ptr,j);
- return error;
+ return err;
}
@@ -3191,8 +3193,9 @@ void Field_time::sql_type(String &res) const
int Field_year::store(const char *from, uint len,CHARSET_INFO *cs)
{
+ int err;
char *end;
- long nr= my_strntol(cs, from, len, &end, 10);
+ long nr= my_strntol(cs, from, len, 10, &end, &err);
if (nr < 0 || nr >= 100 && nr <= 1900 || nr > 2155)
{
@@ -3929,15 +3932,17 @@ int Field_string::store(longlong nr)
double Field_string::val_real(void)
{
+ int err;
CHARSET_INFO *cs=charset();
- return my_strntod(cs,ptr,field_length,(char**)0);
+ return my_strntod(cs,ptr,field_length,(char**)0,&err);
}
longlong Field_string::val_int(void)
{
+ int err;
CHARSET_INFO *cs=charset();
- return my_strntoll(cs,ptr,field_length,NULL,10);
+ return my_strntoll(cs,ptr,field_length,10,NULL,&err);
}
@@ -4096,17 +4101,19 @@ int Field_varstring::store(longlong nr)
double Field_varstring::val_real(void)
{
+ int err;
uint length=uint2korr(ptr)+2;
CHARSET_INFO *cs=charset();
- return my_strntod(cs,ptr+2,length,(char**)0);
+ return my_strntod(cs,ptr+2,length,(char**)0,&err);
}
longlong Field_varstring::val_int(void)
{
+ int err;
uint length=uint2korr(ptr)+2;
CHARSET_INFO *cs=charset();
- return my_strntoll(cs,ptr+2,length,NULL,10);
+ return my_strntoll(cs,ptr+2,length,10,NULL,&err);
}
@@ -4414,24 +4421,26 @@ int Field_blob::store(longlong nr)
double Field_blob::val_real(void)
{
+ int err;
char *blob;
memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
if (!blob)
return 0.0;
uint32 length=get_length(ptr);
CHARSET_INFO *cs=charset();
- return my_strntod(cs,blob,length,(char**)0);
+ return my_strntod(cs,blob,length,(char**)0,&err);
}
longlong Field_blob::val_int(void)
{
+ int err;
char *blob;
memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
if (!blob)
return 0;
uint32 length=get_length(ptr);
- return my_strntoll(charset(),blob,length,NULL,10);
+ return my_strntoll(charset(),blob,length,10,NULL,&err);
}
@@ -4846,7 +4855,7 @@ uint find_enum(TYPELIB *lib,const char *x, uint length)
int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs)
{
- int error= 0;
+ int err= 0;
uint tmp=find_enum(typelib,from,length);
if (!tmp)
{
@@ -4854,20 +4863,18 @@ int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs)
{
/* This is for reading numbers with LOAD DATA INFILE */
char *end;
- my_errno=0;
- tmp=(uint) my_strntoul(cs,from,length,&end,10);
- if (my_errno || end != from+length || tmp > typelib->count)
+ tmp=(uint) my_strntoul(cs,from,length,10,&end,&err);
+ if (err || end != from+length || tmp > typelib->count)
{
tmp=0;
current_thd->cuted_fields++;
- error=1;
}
}
else
current_thd->cuted_fields++;
}
store_type((ulonglong) tmp);
- return error;
+ return err;
}
@@ -5052,7 +5059,7 @@ ulonglong find_set(TYPELIB *lib, const char *x, uint length, char **err_pos,
int Field_set::store(const char *from,uint length,CHARSET_INFO *cs)
{
- int error= 0;
+ int err= 0;
char *not_used;
uint not_used2;
@@ -5061,19 +5068,17 @@ int Field_set::store(const char *from,uint length,CHARSET_INFO *cs)
{
/* This is for reading numbers with LOAD DATA INFILE */
char *end;
- my_errno=0;
- tmp=my_strntoull(cs,from,length,&end,10);
- if (my_errno || end != from+length ||
+ tmp=my_strntoull(cs,from,length,10,&end,&err);
+ if (err || end != from+length ||
tmp > (ulonglong) (((longlong) 1 << typelib->count) - (longlong) 1))
{
tmp=0;
- error=1;
}
else
current_thd->cuted_fields--; // Remove warning from find_set
}
store_type(tmp);
- return error;
+ return err;
}
diff --git a/sql/item.cc b/sql/item.cc
index 925ee9ac0f4..ecc63aa4b95 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -378,10 +378,11 @@ int Item_param::save_in_field(Field *field, bool no_conversions)
double Item_param::val()
{
+ int err;
switch (item_result_type) {
case STRING_RESULT:
return (double) my_strntod(str_value.charset(), (char*) str_value.ptr(),
- str_value.length(), (char**) 0);
+ str_value.length(), (char**) 0, &err);
case INT_RESULT:
return (double)int_value;
default:
@@ -392,9 +393,12 @@ double Item_param::val()
longlong Item_param::val_int()
{
+ int err;
switch (item_result_type) {
case STRING_RESULT:
- return my_strntoll(str_value.charset(),str_value.ptr(),str_value.length(),(char**) 0,10);
+ return my_strntoll(str_value.charset(),
+ str_value.ptr(),str_value.length(),10,
+ (char**) 0,&err);
case REAL_RESULT:
return (longlong) (real_value+(real_value > 0 ? 0.5 : -0.5));
default:
@@ -1263,17 +1267,19 @@ void Item_cache_str::store(Item *item)
}
double Item_cache_str::val()
{
+ int err;
if (value)
return my_strntod(value->charset(), (char*) value->ptr(),
- value->length(), (char**) 0);
+ value->length(), (char**) 0, &err);
else
return (double)0;
}
longlong Item_cache_str::val_int()
{
+ int err;
if (value)
return my_strntoll(value->charset(), value->ptr(),
- value->length(), (char**) 0, 10);
+ value->length(), 10, (char**) 0, &err);
else
return (longlong)0;
}
diff --git a/sql/item.h b/sql/item.h
index 907c293d454..03e9a542eea 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -344,13 +344,15 @@ public:
enum Type type() const { return STRING_ITEM; }
double val()
{
+ int err;
return my_strntod(str_value.charset(), (char*) str_value.ptr(),
- str_value.length(), (char**) 0);
+ str_value.length(), (char**) 0, &err);
}
longlong val_int()
{
+ int err;
return my_strntoll(str_value.charset(), str_value.ptr(),
- str_value.length(), (char**) 0, 10);
+ str_value.length(), 10, (char**) 0, &err);
}
String *val_str(String*) { return (String*) &str_value; }
int save_in_field(Field *field, bool no_conversions);
@@ -599,12 +601,16 @@ public:
enum_field_types field_type() const { return cached_field_type; }
double val()
{
+ int err;
return (null_value ? 0.0 :
my_strntod(str_value.charset(), (char*) str_value.ptr(),
- str_value.length(),NULL));
+ str_value.length(),NULL,&err));
}
longlong val_int()
- { return null_value ? LL(0) : my_strntoll(str_value.charset(),str_value.ptr(),str_value.length(),(char**) 0,10); }
+ {
+ int err;
+ return null_value ? LL(0) : my_strntoll(str_value.charset(),str_value.ptr(),str_value.length(),10, (char**) 0,&err);
+ }
String *val_str(String*);
void make_field(Send_field *field) { item->make_field(field); }
void copy();
diff --git a/sql/item_func.h b/sql/item_func.h
index 11793b11bdb..a015f6e69ce 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -812,13 +812,15 @@ public:
String *val_str(String *);
double val()
{
+ int err;
String *res; res=val_str(&str_value);
- return res ? my_strntod(res->charset(),(char*) res->ptr(),res->length(),0) : 0.0;
+ return res ? my_strntod(res->charset(),(char*) res->ptr(),res->length(),0,&err) : 0.0;
}
longlong val_int()
{
+ int err;
String *res; res=val_str(&str_value);
- return res ? my_strntoll(res->charset(),res->ptr(),res->length(),(char**) 0,10) : (longlong) 0;
+ return res ? my_strntoll(res->charset(),res->ptr(),res->length(),10,(char**) 0,&err) : (longlong) 0;
}
enum Item_result result_type () const { return STRING_RESULT; }
void fix_length_and_dec();
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 4358f14f08e..2b9bdfe9a1e 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -52,17 +52,19 @@ uint nr_of_decimals(const char *str)
double Item_str_func::val()
{
+ int err;
String *res;
res=val_str(&str_value);
return res ? my_strntod(res->charset(), (char*) res->ptr(),res->length(),
- NULL) : 0.0;
+ NULL, &err) : 0.0;
}
longlong Item_str_func::val_int()
{
+ int err;
String *res;
res=val_str(&str_value);
- return res ? my_strntoll(res->charset(),res->ptr(),res->length(),NULL,10) : (longlong) 0;
+ return res ? my_strntoll(res->charset(),res->ptr(),res->length(),10,NULL,&err) : (longlong) 0;
}
@@ -1956,6 +1958,7 @@ String *Item_func_conv::val_str(String *str)
longlong dec;
int from_base= (int) args[1]->val_int();
int to_base= (int) args[2]->val_int();
+ int err;
if (args[0]->null_value || args[1]->null_value || args[2]->null_value ||
abs(to_base) > 36 || abs(to_base) < 2 ||
@@ -1966,9 +1969,9 @@ String *Item_func_conv::val_str(String *str)
}
null_value=0;
if (from_base < 0)
- dec= my_strntoll(res->charset(),res->ptr(),res->length(),&endptr,-from_base);
+ dec= my_strntoll(res->charset(),res->ptr(),res->length(),-from_base,&endptr,&err);
else
- dec= (longlong) my_strntoull(res->charset(),res->ptr(),res->length(),&endptr,from_base);
+ dec= (longlong) my_strntoull(res->charset(),res->ptr(),res->length(),from_base,&endptr,&err);
ptr= longlong2str(dec,ans,to_base);
if (str->copy(ans,(uint32) (ptr-ans), thd_charset()))
return &empty_string;
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index b15fceda686..2a96594af4e 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -336,13 +336,14 @@ void Item_sum_variance::update_field(int offset)
double Item_sum_hybrid::val()
{
+ int err;
if (null_value)
return 0.0;
switch (hybrid_type) {
case STRING_RESULT:
String *res; res=val_str(&str_value);
return (res ? my_strntod(res->charset(), (char*) res->ptr(),res->length(),
- (char**) 0) : 0.0);
+ (char**) 0, &err) : 0.0);
case INT_RESULT:
if (unsigned_flag)
return ulonglong2double(sum_int);
diff --git a/sql/item_sum.h b/sql/item_sum.h
index ffc9558822d..c49311082e8 100644
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@ -483,14 +483,16 @@ public:
String *val_str(String *);
double val()
{
+ int err;
String *res; res=val_str(&str_value);
return res ? my_strntod(res->charset(),(char*) res->ptr(),res->length(),
- (char**) 0) : 0.0;
+ (char**) 0, &err) : 0.0;
}
longlong val_int()
{
+ int err;
String *res; res=val_str(&str_value);
- return res ? my_strntoll(res->charset(),res->ptr(),res->length(),(char**) 0,10) : (longlong) 0;
+ return res ? my_strntoll(res->charset(),res->ptr(),res->length(),10, (char**) 0, &err) : (longlong) 0;
}
enum Item_result result_type () const { return STRING_RESULT; }
void fix_length_and_dec();
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 18da509529b..f30034049f0 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -4666,9 +4666,10 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
berkeley_lock_type=berkeley_lock_types[type-1];
else
{
+ int err;
char *end;
uint length= strlen(argument);
- long value= my_strntol(my_charset_latin1, argument, length, &end, 10);
+ long value= my_strntol(my_charset_latin1, argument, length, 10, &end, &err);
if (test_if_int(argument,(uint) length, end, my_charset_latin1))
berkeley_lock_scan_time= value;
else
diff --git a/sql/procedure.h b/sql/procedure.h
index bc77803230f..03a45488b03 100644
--- a/sql/procedure.h
+++ b/sql/procedure.h
@@ -59,7 +59,7 @@ public:
void set(double nr) { value=nr; }
void set(longlong nr) { value=(double) nr; }
void set(const char *str,uint length,CHARSET_INFO *cs)
- { value=my_strntod(cs,(char*) str,length,(char**)0); }
+ { int err; value=my_strntod(cs,(char*) str,length,(char**)0,&err); }
double val() { return value; }
longlong val_int() { return (longlong) value; }
String *val_str(String *s) { s->set(value,decimals,thd_charset()); return s; }
@@ -77,7 +77,7 @@ public:
void set(double nr) { value=(longlong) nr; }
void set(longlong nr) { value=nr; }
void set(const char *str,uint length, CHARSET_INFO *cs)
- { value=my_strntoll(cs,str,length,NULL,10); }
+ { int err; value=my_strntoll(cs,str,length,10,NULL,&err); }
double val() { return (double) value; }
longlong val_int() { return value; }
String *val_str(String *s) { s->set(value, thd_charset()); return s; }
@@ -98,14 +98,16 @@ public:
{ str_value.copy(str,length,cs); }
double val()
{
+ int err;
CHARSET_INFO *cs=str_value.charset();
return my_strntod(cs, (char*) str_value.ptr(), str_value.length(),
- (char**) 0);
+ (char**) 0, &err);
}
longlong val_int()
{
+ int err;
CHARSET_INFO *cs=str_value.charset();
- return my_strntoll(cs,str_value.ptr(),str_value.length(),NULL,10);
+ return my_strntoll(cs,str_value.ptr(),str_value.length(),10,NULL,&err);
}
String *val_str(String*)
{
diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c
index 07e7a382f8a..df1609c983d 100644
--- a/strings/ctype-simple.c
+++ b/strings/ctype-simple.c
@@ -17,7 +17,6 @@
#include <my_global.h>
#include "m_string.h"
#include "m_ctype.h"
-#include "my_sys.h" /* defines errno */
#include <errno.h>
#include "stdarg.h"
@@ -203,7 +202,8 @@ void my_hash_sort_simple(CHARSET_INFO *cs,
long my_strntol_8bit(CHARSET_INFO *cs,
- const char *nptr, uint l, char **endptr, int base)
+ const char *nptr, uint l, int base,
+ char **endptr, int *err)
{
int negative;
register ulong cutoff;
@@ -303,14 +303,14 @@ long my_strntol_8bit(CHARSET_INFO *cs,
if (overflow)
{
- my_errno=(ERANGE);
+ err[0]= ERANGE;
return negative ? LONG_MIN : LONG_MAX;
}
return (negative ? -((long) i) : (long) i);
noconv:
- my_errno=(EDOM);
+ err[0]= EDOM;
if (endptr != NULL)
*endptr = (char *) nptr;
return 0L;
@@ -318,7 +318,8 @@ noconv:
ulong my_strntoul_8bit(CHARSET_INFO *cs,
- const char *nptr, uint l, char **endptr, int base)
+ const char *nptr, uint l, int base,
+ char **endptr, int *err)
{
int negative;
register ulong cutoff;
@@ -409,14 +410,14 @@ ulong my_strntoul_8bit(CHARSET_INFO *cs,
if (overflow)
{
- my_errno=(ERANGE);
+ err[0]= ERANGE;
return ((ulong)~0L);
}
return (negative ? -((long) i) : (long) i);
noconv:
- my_errno=(EDOM);
+ err[0]= EDOM;
if (endptr != NULL)
*endptr = (char *) nptr;
return 0L;
@@ -424,7 +425,8 @@ noconv:
longlong my_strntoll_8bit(CHARSET_INFO *cs __attribute__((unused)),
- const char *nptr, uint l, char **endptr, int base)
+ const char *nptr, uint l, int base,
+ char **endptr,int *err)
{
int negative;
register ulonglong cutoff;
@@ -524,14 +526,14 @@ longlong my_strntoll_8bit(CHARSET_INFO *cs __attribute__((unused)),
if (overflow)
{
- my_errno=(ERANGE);
+ err[0]= ERANGE;
return negative ? LONGLONG_MIN : LONGLONG_MAX;
}
return (negative ? -((longlong) i) : (longlong) i);
noconv:
- my_errno=(EDOM);
+ err[0]= EDOM;
if (endptr != NULL)
*endptr = (char *) nptr;
return 0L;
@@ -539,7 +541,8 @@ noconv:
ulonglong my_strntoull_8bit(CHARSET_INFO *cs,
- const char *nptr, uint l, char **endptr, int base)
+ const char *nptr, uint l, int base,
+ char **endptr, int *err)
{
int negative;
register ulonglong cutoff;
@@ -631,14 +634,14 @@ ulonglong my_strntoull_8bit(CHARSET_INFO *cs,
if (overflow)
{
- my_errno=(ERANGE);
+ err[0]= ERANGE;
return (~(ulonglong) 0);
}
return (negative ? -((longlong) i) : (longlong) i);
noconv:
- my_errno=(EDOM);
+ err[0]= EDOM;
if (endptr != NULL)
*endptr = (char *) nptr;
return 0L;
@@ -667,7 +670,8 @@ noconv:
double my_strntod_8bit(CHARSET_INFO *cs __attribute__((unused)),
- char *str, uint length, char **end)
+ char *str, uint length,
+ char **end, int *err __attribute__ ((unused)))
{
char end_char;
double result;
diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c
index 7ca3395c2cc..e57f35bab19 100644
--- a/strings/ctype-utf8.c
+++ b/strings/ctype-utf8.c
@@ -21,7 +21,6 @@
#include <my_global.h>
#include "m_string.h"
#include "m_ctype.h"
-#include "my_sys.h" /* defines errno */
#include <errno.h>
#ifdef HAVE_CHARSET_utf8
@@ -2446,7 +2445,8 @@ static int my_snprintf_ucs2(CHARSET_INFO *cs __attribute__((unused))
long my_strntol_ucs2(CHARSET_INFO *cs,
- const char *nptr, uint l, char **endptr, int base)
+ const char *nptr, uint l, int base,
+ char **endptr, int *err)
{
int negative=0;
int overflow;
@@ -2475,7 +2475,7 @@ long my_strntol_ucs2(CHARSET_INFO *cs,
{
if (endptr !=NULL )
*endptr = (char*)s;
- my_errno = (cnv==MY_CS_ILSEQ) ? EILSEQ : EDOM;
+ err[0] = (cnv==MY_CS_ILSEQ) ? EILSEQ : EDOM;
return 0;
}
s+=cnv;
@@ -2518,7 +2518,7 @@ bs:
{
if (endptr !=NULL )
*endptr = (char*)s;
- my_errno=EILSEQ;
+ err[0]=EILSEQ;
return 0;
}
else
@@ -2533,7 +2533,7 @@ bs:
if (s == save)
{
- my_errno=EDOM;
+ err[0]=EDOM;
return 0L;
}
@@ -2547,7 +2547,7 @@ bs:
if (overflow)
{
- my_errno=(ERANGE);
+ err[0]=ERANGE;
return negative ? LONG_MIN : LONG_MAX;
}
@@ -2556,7 +2556,8 @@ bs:
ulong my_strntoul_ucs2(CHARSET_INFO *cs,
- const char *nptr, uint l, char **endptr, int base)
+ const char *nptr, uint l, int base,
+ char **endptr, int *err)
{
int negative=0;
int overflow;
@@ -2585,7 +2586,7 @@ ulong my_strntoul_ucs2(CHARSET_INFO *cs,
{
if (endptr !=NULL )
*endptr = (char*)s;
- my_errno = (cnv==MY_CS_ILSEQ) ? EILSEQ : EDOM;
+ err[0] = (cnv==MY_CS_ILSEQ) ? EILSEQ : EDOM;
return 0;
}
s+=cnv;
@@ -2628,7 +2629,7 @@ bs:
{
if (endptr !=NULL )
*endptr = (char*)s;
- my_errno=EILSEQ;
+ err[0]=EILSEQ;
return 0;
}
else
@@ -2643,13 +2644,13 @@ bs:
if (s == save)
{
- my_errno=EDOM;
+ err[0]=EDOM;
return 0L;
}
if (overflow)
{
- my_errno=(ERANGE);
+ err[0]=(ERANGE);
return ((ulong)~0L);
}
@@ -2660,7 +2661,8 @@ bs:
longlong my_strntoll_ucs2(CHARSET_INFO *cs,
- const char *nptr, uint l, char **endptr, int base)
+ const char *nptr, uint l, int base,
+ char **endptr, int *err)
{
int negative=0;
int overflow;
@@ -2689,7 +2691,7 @@ longlong my_strntoll_ucs2(CHARSET_INFO *cs,
{
if (endptr !=NULL )
*endptr = (char*)s;
- my_errno = (cnv==MY_CS_ILSEQ) ? EILSEQ : EDOM;
+ err[0] = (cnv==MY_CS_ILSEQ) ? EILSEQ : EDOM;
return 0;
}
s+=cnv;
@@ -2732,7 +2734,7 @@ bs:
{
if (endptr !=NULL )
*endptr = (char*)s;
- my_errno=EILSEQ;
+ err[0]=EILSEQ;
return 0;
}
else
@@ -2747,7 +2749,7 @@ bs:
if (s == save)
{
- my_errno=EDOM;
+ err[0]=EDOM;
return 0L;
}
@@ -2761,7 +2763,7 @@ bs:
if (overflow)
{
- my_errno=(ERANGE);
+ err[0]=ERANGE;
return negative ? LONGLONG_MIN : LONGLONG_MAX;
}
@@ -2772,7 +2774,8 @@ bs:
ulonglong my_strntoull_ucs2(CHARSET_INFO *cs,
- const char *nptr, uint l, char **endptr, int base)
+ const char *nptr, uint l, int base,
+ char **endptr, int *err)
{
int negative=0;
int overflow;
@@ -2801,7 +2804,7 @@ ulonglong my_strntoull_ucs2(CHARSET_INFO *cs,
{
if (endptr !=NULL )
*endptr = (char*)s;
- my_errno = (cnv==MY_CS_ILSEQ) ? EILSEQ : EDOM;
+ err[0]= (cnv==MY_CS_ILSEQ) ? EILSEQ : EDOM;
return 0;
}
s+=cnv;
@@ -2844,7 +2847,7 @@ bs:
{
if (endptr !=NULL )
*endptr = (char*)s;
- my_errno=EILSEQ;
+ err[0]= EILSEQ;
return 0;
}
else
@@ -2859,13 +2862,13 @@ bs:
if (s == save)
{
- my_errno=EDOM;
+ err[0]= EDOM;
return 0L;
}
if (overflow)
{
- my_errno=(ERANGE);
+ err[0]= ERANGE;
return (~(ulonglong) 0);
}
@@ -2874,7 +2877,8 @@ bs:
double my_strntod_ucs2(CHARSET_INFO *cs __attribute__((unused)),
- char *nptr, uint length, char **endptr)
+ char *nptr, uint length,
+ char **endptr, int *err __attribute__ ((unused)))
{
char buf[256];
double res;
diff --git a/strings/ctype.c b/strings/ctype.c
index 76636d17ace..615f0b7ef49 100644
--- a/strings/ctype.c
+++ b/strings/ctype.c
@@ -3983,6 +3983,7 @@ typedef struct my_cs_file_info
static int fill_uchar(uchar *a,uint size,const char *str, uint len)
{
+ int err=0;
uint i= 0;
const char *s, *b, *e=str+len;
@@ -3993,7 +3994,7 @@ static int fill_uchar(uchar *a,uint size,const char *str, uint len)
for ( ; (s < e) && !strchr(" \t\r\n",s[0]); s++) ;
if (s == b || i > size)
break;
- a[i]= my_strntoul(my_charset_latin1,b,s-b,NULL,16);
+ a[i]= my_strntoul(my_charset_latin1,b,s-b,16,NULL,&err);
}
return 0;
}
@@ -4001,6 +4002,8 @@ static int fill_uchar(uchar *a,uint size,const char *str, uint len)
static int fill_uint16(uint16 *a,uint size,const char *str, uint len)
{
uint i= 0;
+ int err;
+
const char *s, *b, *e=str+len;
for (s=str ; s < e ; i++)
{
@@ -4009,7 +4012,7 @@ static int fill_uint16(uint16 *a,uint size,const char *str, uint len)
for ( ; (s < e) && !strchr(" \t\r\n",s[0]); s++) ;
if (s == b || i > size)
break;
- a[i]= my_strntol(my_charset_latin1,b,s-b,NULL,16);
+ a[i]= my_strntol(my_charset_latin1,b,s-b,16,NULL,&err);
}
return 0;
}
@@ -4051,6 +4054,7 @@ static int cs_value(MY_XML_PARSER *st,const char *attr, uint len)
struct my_cs_file_info *i= (struct my_cs_file_info *)st->user_data;
struct my_cs_file_section_st *s;
int state= (s=cs_file_sec(st->attr,strlen(st->attr))) ? s->state : 0;
+ int err;
#ifndef DBUG_OFF
if(0){
@@ -4062,7 +4066,7 @@ static int cs_value(MY_XML_PARSER *st,const char *attr, uint len)
switch (state) {
case _CS_ID:
- i->cs.number= my_strntoul(my_charset_latin1,attr,len,(char**)NULL,0);
+ i->cs.number= my_strntoul(my_charset_latin1,attr,len,0,(char**)NULL,&err);
break;
case _CS_COLNAME:
i->cs.name=mstr(i->name,attr,len,MY_CS_NAME_SIZE-1);