Bug #4797 - 32 bit and 64 bit builds behave differently on int32 overflow
This commit is contained in:
parent
3c963455c1
commit
6023b58b9f
@ -642,21 +642,27 @@ extern double my_atof(const char*);
|
|||||||
#endif /* defined (HAVE_LONG_LONG) && !defined(ULONGLONG_MAX)*/
|
#endif /* defined (HAVE_LONG_LONG) && !defined(ULONGLONG_MAX)*/
|
||||||
|
|
||||||
#if SIZEOF_LONG == 4
|
#if SIZEOF_LONG == 4
|
||||||
#define INT_MIN32 (long) 0x80000000L
|
#define INT_MIN32 ((long) 0x80000000L)
|
||||||
#define INT_MAX32 (long) 0x7FFFFFFFL
|
#define INT_MAX32 ((long) 0x7FFFFFFFL)
|
||||||
#define INT_MIN24 ((long) 0xff800000L)
|
#define UINT_MAX32 ((long) 0xFFFFFFFFL)
|
||||||
#define INT_MAX24 0x007fffffL
|
#define INT_MIN24 ((long) 0xFF800000L)
|
||||||
#define INT_MIN16 ((short int) 0x8000)
|
#define INT_MAX24 0x007FFFFFL
|
||||||
#define INT_MAX16 0x7FFF
|
#define UINT_MAX24 0x00FFFFFFL
|
||||||
#define INT_MIN8 ((char) 0x80)
|
#define INT_MIN16 ((short int) 0x8000)
|
||||||
#define INT_MAX8 ((char) 0x7F)
|
#define INT_MAX16 0x7FFF
|
||||||
|
#define UINT_MAX16 0xFFFF
|
||||||
|
#define INT_MIN8 ((char) 0x80)
|
||||||
|
#define INT_MAX8 ((char) 0x7F)
|
||||||
#else /* Probably Alpha */
|
#else /* Probably Alpha */
|
||||||
#define INT_MIN32 ((long) (int) 0x80000000)
|
#define INT_MIN32 ((long) (int) 0x80000000)
|
||||||
#define INT_MAX32 ((long) (int) 0x7FFFFFFF)
|
#define INT_MAX32 ((long) (int) 0x7FFFFFFF)
|
||||||
#define INT_MIN24 ((long) (int) 0xff800000)
|
#define UINT_MAX32 ((long) (int) 0xFFFFFFFF)
|
||||||
#define INT_MAX24 ((long) (int) 0x007fffff)
|
#define INT_MIN24 ((long) (int) 0xFF800000)
|
||||||
#define INT_MIN16 ((short int) 0xffff8000)
|
#define INT_MAX24 ((long) (int) 0x007FFFFF)
|
||||||
|
#define UINT_MAX24 ((long) (int) 0x00FFFFFF)
|
||||||
|
#define INT_MIN16 ((short int) 0xFFFF8000)
|
||||||
#define INT_MAX16 ((short int) 0x00007FFF)
|
#define INT_MAX16 ((short int) 0x00007FFF)
|
||||||
|
#define UINT_MAX16 ((short int) 0x0000FFFF)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* From limits.h instead */
|
/* From limits.h instead */
|
||||||
|
@ -2,8 +2,10 @@ drop table if exists t1;
|
|||||||
create table t1 (this int unsigned);
|
create table t1 (this int unsigned);
|
||||||
insert into t1 values (1);
|
insert into t1 values (1);
|
||||||
insert into t1 values (-1);
|
insert into t1 values (-1);
|
||||||
|
insert into t1 values ('5000000000');
|
||||||
select * from t1;
|
select * from t1;
|
||||||
this
|
this
|
||||||
1
|
1
|
||||||
0
|
0
|
||||||
|
4294967295
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
@ -6,5 +6,6 @@ drop table if exists t1;
|
|||||||
create table t1 (this int unsigned);
|
create table t1 (this int unsigned);
|
||||||
insert into t1 values (1);
|
insert into t1 values (1);
|
||||||
insert into t1 values (-1);
|
insert into t1 values (-1);
|
||||||
|
insert into t1 values ('5000000000');
|
||||||
select * from t1;
|
select * from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
29
sql/field.cc
29
sql/field.cc
@ -1504,7 +1504,7 @@ void Field_long::store(const char *from,uint len)
|
|||||||
{
|
{
|
||||||
len--; from++;
|
len--; from++;
|
||||||
}
|
}
|
||||||
long tmp;
|
long tmp, cuted_fields=0;
|
||||||
String tmp_str(from,len);
|
String tmp_str(from,len);
|
||||||
from= tmp_str.c_ptr(); // Add end null if needed
|
from= tmp_str.c_ptr(); // Add end null if needed
|
||||||
errno=0;
|
errno=0;
|
||||||
@ -1520,9 +1520,34 @@ void Field_long::store(const char *from,uint len)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
tmp=strtol(from, &end, 10);
|
tmp=strtol(from, &end, 10);
|
||||||
if (errno ||
|
if (errno ||
|
||||||
(from+len != end && current_thd->count_cuted_fields &&
|
(from+len != end && current_thd->count_cuted_fields &&
|
||||||
!test_if_int(from,len)))
|
!test_if_int(from,len)))
|
||||||
|
cuted_fields=1;
|
||||||
|
#if SIZEOF_LONG > 4
|
||||||
|
if (unsigned_flag)
|
||||||
|
{
|
||||||
|
if (tmp > UINT_MAX32)
|
||||||
|
{
|
||||||
|
tmp= UINT_MAX32;
|
||||||
|
cuted_fields=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (tmp > INT_MAX32)
|
||||||
|
{
|
||||||
|
tmp= INT_MAX32;
|
||||||
|
cuted_fields=1;
|
||||||
|
}
|
||||||
|
else if (tmp < INT_MIN32)
|
||||||
|
{
|
||||||
|
tmp= INT_MIN32;
|
||||||
|
cuted_fields=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (cuted_fields)
|
||||||
current_thd->cuted_fields++;
|
current_thd->cuted_fields++;
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
if (table->db_low_byte_first)
|
if (table->db_low_byte_first)
|
||||||
|
@ -34,9 +34,6 @@
|
|||||||
|
|
||||||
#define MAX_TREEMEM 8192
|
#define MAX_TREEMEM 8192
|
||||||
#define MAX_TREE_ELEMENTS 256
|
#define MAX_TREE_ELEMENTS 256
|
||||||
#define UINT_MAX16 0xffff
|
|
||||||
#define UINT_MAX24 0xffffff
|
|
||||||
#define UINT_MAX32 0xffffffff
|
|
||||||
|
|
||||||
int sortcmp2(void* cmp_arg __attribute__((unused)),
|
int sortcmp2(void* cmp_arg __attribute__((unused)),
|
||||||
const String *a,const String *b)
|
const String *a,const String *b)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user