Commit ab64eb64 authored by unknown's avatar unknown
Browse files

Bug #4797 - 32 bit and 64 bit builds behave differently on int32 overflow


include/my_global.h:
  uint_max constants moved from sql_analyse.cc
sql/sql_analyse.cc:
  cleanup
parent c7a29120
Loading
Loading
Loading
Loading
+17 −11
Original line number Diff line number Diff line
@@ -642,21 +642,27 @@ extern double my_atof(const char*);
#endif /* defined (HAVE_LONG_LONG) && !defined(ULONGLONG_MAX)*/

#if SIZEOF_LONG == 4
#define INT_MIN32	(long) 0x80000000L
#define INT_MAX32	(long) 0x7FFFFFFFL
#define INT_MIN24	((long) 0xff800000L)
#define INT_MAX24	0x007fffffL
#define INT_MIN32       ((long) 0x80000000L)
#define INT_MAX32       ((long) 0x7FFFFFFFL)
#define UINT_MAX32      ((long) 0xFFFFFFFFL)
#define INT_MIN24       ((long) 0xFF800000L)
#define INT_MAX24       0x007FFFFFL
#define UINT_MAX24      0x00FFFFFFL
#define INT_MIN16       ((short int) 0x8000)
#define INT_MAX16       0x7FFF
#define UINT_MAX16      0xFFFF
#define INT_MIN8        ((char) 0x80)
#define INT_MAX8        ((char) 0x7F)
#else  /* Probably Alpha */
#define INT_MIN32	((long) (int) 0x80000000)
#define INT_MAX32	((long) (int) 0x7FFFFFFF)
#define INT_MIN24	((long) (int) 0xff800000)
#define INT_MAX24	((long) (int) 0x007fffff)
#define INT_MIN16	((short int) 0xffff8000)
#define UINT_MAX32	((long) (int) 0xFFFFFFFF)
#define INT_MIN24	((long) (int) 0xFF800000)
#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 UINT_MAX16      ((short int) 0x0000FFFF)
#endif

/* From limits.h instead */
+2 −0
Original line number Diff line number Diff line
@@ -2,8 +2,10 @@ drop table if exists t1;
create table t1 (this int unsigned);
insert into t1 values (1);
insert into t1 values (-1);
insert into t1 values ('5000000000');
select * from t1;
this
1
0
4294967295
drop table t1;
+1 −0
Original line number Diff line number Diff line
@@ -6,5 +6,6 @@ drop table if exists t1;
create table t1 (this int unsigned);
insert into t1 values (1);
insert into t1 values (-1);
insert into t1 values ('5000000000');
select * from t1;
drop table t1;
+27 −2
Original line number Diff line number Diff line
@@ -1504,7 +1504,7 @@ void Field_long::store(const char *from,uint len)
  {
    len--; from++;
  }
  long tmp;
  long tmp, cuted_fields=0;
  String tmp_str(from,len);
  from= tmp_str.c_ptr();			// Add end null if needed
  errno=0;
@@ -1523,6 +1523,31 @@ void Field_long::store(const char *from,uint len)
  if (errno ||
      (from+len != end && current_thd->count_cuted_fields &&
       !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++;
#ifdef WORDS_BIGENDIAN
  if (table->db_low_byte_first)
+0 −3
Original line number Diff line number Diff line
@@ -34,9 +34,6 @@

#define MAX_TREEMEM	  8192
#define MAX_TREE_ELEMENTS 256
#define UINT_MAX16	  0xffff
#define UINT_MAX24	  0xffffff
#define UINT_MAX32	  0xffffffff

int sortcmp2(void* cmp_arg __attribute__((unused)),
	     const String *a,const String *b)