summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2004-05-07 01:43:17 +0300
committerunknown <monty@mysql.com>2004-05-07 01:43:17 +0300
commitf3544f3c5dd137e125a980c151e53ab71b23aba5 (patch)
treef2717f686b72c32ff82659eaf22da3a53b8deb1a
parentffdf46a58ac73ce0862f1cf632e4254170ed6116 (diff)
downloadmariadb-git-f3544f3c5dd137e125a980c151e53ab71b23aba5.tar.gz
Portability fixes
Change strtoll -> my_strtoll10() Fixed bug in my_strntoul() and my_strntol() where we got different values on 32 and 64 bit systems (Bug #3472) configure.in: Fixed problem on IRIX64 (One can't have AC_MSG_RESULT on same row as AC_DEFINE extra/my_print_defaults.c: Fixed wrong definition for 'verbose' include/my_global.h: Portability fix (IRIX64) libmysql/client_settings.h: Remove compiler warnings libmysql/libmysql.c: Remove compiler warnings mysql-test/r/func_str.result: Updated results mysql-test/r/key_cache.result: Updated results to not depend on key_blocks_unused mysql-test/t/func_str.test: More test of long overflow mysql-test/t/key_cache.test: Updated results to not depend on key_blocks_unused sql/item.cc: Portability fix (don't use strtoll()) sql/item.h: Portability fix (don't use strtoll()) sql/item_sum.h: Portability fix (don't use strtoll()) sql/item_timefunc.cc: Fixed compiler warning strings/ctype-simple.c: Fixed bug in my_strntoul() and my_strntol() where we got different values on 32 and 64 bit systems strings/ctype-ucs2.c: Fixed bug in my_strntoul() and my_strntol() where we got different values on 32 and 64 bit systems
-rw-r--r--configure.in3
-rw-r--r--extra/my_print_defaults.c2
-rw-r--r--include/my_global.h2
-rw-r--r--libmysql/client_settings.h6
-rw-r--r--libmysql/libmysql.c10
-rw-r--r--mysql-test/r/func_str.result15
-rw-r--r--mysql-test/r/key_cache.result12
-rw-r--r--mysql-test/t/func_str.test5
-rw-r--r--mysql-test/t/key_cache.test16
-rw-r--r--sql/item.cc23
-rw-r--r--sql/item.h9
-rw-r--r--sql/item_sum.h8
-rw-r--r--sql/item_timefunc.cc2
-rw-r--r--strings/ctype-simple.c28
-rw-r--r--strings/ctype-ucs2.c29
15 files changed, 100 insertions, 70 deletions
diff --git a/configure.in b/configure.in
index c9738ed63a3..7d7c477e0f2 100644
--- a/configure.in
+++ b/configure.in
@@ -1851,7 +1851,8 @@ AC_CHECK_FUNCS(alarm bcmp bfill bmove bzero chsize cuserid fchmod fcntl \
# isinf() could be a function or a macro (HPUX)
AC_MSG_CHECKING(for isinf with <math.h>)
AC_TRY_LINK([#include <math.h>], [float f = 0.0; isinf(f)],
- AC_MSG_RESULT(yes) AC_DEFINE(HAVE_ISINF,,[isinf() macro or function]),
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_ISINF,,[isinf() macro or function]),
AC_MSG_RESULT(no))
CFLAGS="$ORG_CFLAGS"
diff --git a/extra/my_print_defaults.c b/extra/my_print_defaults.c
index e580603bcb8..f4da839f8e2 100644
--- a/extra/my_print_defaults.c
+++ b/extra/my_print_defaults.c
@@ -49,7 +49,7 @@ static struct my_option my_long_options[] =
{"help", '?', "Display this help message and exit.",
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{"verbose", 'v', "Increase the output level",
- 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
+ 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{"version", 'V', "Output version information and exit.",
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
diff --git a/include/my_global.h b/include/my_global.h
index 7540897e6f4..e7d924eb0ca 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -674,7 +674,7 @@ typedef SOCKET_SIZE_TYPE size_socket;
#define FLT_MAX ((float)3.40282346638528860e+38)
#endif
-#ifndef HAVE_ISINF
+#if !defined(HAVE_ISINF) && !defined(isinf)
#define isinf(X) 0
#endif
diff --git a/libmysql/client_settings.h b/libmysql/client_settings.h
index a9695801e65..1c1ff9bac10 100644
--- a/libmysql/client_settings.h
+++ b/libmysql/client_settings.h
@@ -62,10 +62,4 @@ int cli_read_change_user_result(MYSQL *mysql, char *buff, const char *passwd);
#ifdef EMBEDDED_LIBRARY
int init_embedded_server(int argc, char **argv, char **groups);
void end_embedded_server();
-
-#else
-/* Prevent warnings of unused parameters */
-#define init_embedded_server(a,b,c) ((void)a, (void)b, (void)c, 0)
-#define end_embedded_server()
#endif /*EMBEDDED_LIBRARY*/
-
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index 6ee2ba438bd..8903ae83f4b 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -113,7 +113,9 @@ static my_bool org_my_init_done= 0;
1 could not initialize environment (out of memory or thread keys)
*/
-int STDCALL mysql_server_init(int argc, char **argv, char **groups)
+int STDCALL mysql_server_init(int argc __attribute__((unused)),
+ char **argv __attribute__((unused)),
+ char **groups __attribute__((unused)))
{
int result= 0;
if (!mysql_client_init)
@@ -152,7 +154,9 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
#if defined(SIGPIPE) && !defined(__WIN__)
(void) signal(SIGPIPE, SIG_IGN);
#endif
+#ifdef EMBEDDED_LIBRARY
result= init_embedded_server(argc, argv, groups);
+#endif
}
#ifdef THREAD
else
@@ -164,7 +168,9 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
void STDCALL mysql_server_end()
{
+#ifdef EMBEDDED_LIBRARY
end_embedded_server();
+#endif
/* If library called my_init(), free memory allocated by it */
if (!org_my_init_done)
{
@@ -4054,7 +4060,9 @@ static void stmt_update_metadata(MYSQL_STMT *stmt, MYSQL_ROWS *data)
MYSQL_FIELD *field;
uchar *null_ptr, bit;
uchar *row= (uchar*) data->data;
+#ifndef DBUG_OFF
uchar *row_end= row + data->length;
+#endif
null_ptr= row;
row+= (stmt->field_count+9)/8; /* skip null bits */
diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result
index 9904242b3e0..216e2ed26f2 100644
--- a/mysql-test/r/func_str.result
+++ b/mysql-test/r/func_str.result
@@ -639,14 +639,21 @@ name
aaaaaaaaaaccccc
bbbbbbbbbbddddd
drop table t1, t2;
-create table t1 (c1 INT);
-insert into t1 (c1) values ('21474836461');
+create table t1 (c1 INT, c2 INT UNSIGNED);
+insert into t1 values ('21474836461','21474836461');
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
+Warning 1265 Data truncated for column 'c2' at row 1
+insert into t1 values ('-21474836461','-21474836461');
+Warnings:
+Warning 1265 Data truncated for column 'c1' at row 1
+Warning 1265 Data truncated for column 'c2' at row 1
show warnings;
Level Code Message
Warning 1265 Data truncated for column 'c1' at row 1
+Warning 1265 Data truncated for column 'c2' at row 1
select * from t1;
-c1
-2147483647
+c1 c2
+2147483647 4294967295
+-2147483648 0
drop table t1;
diff --git a/mysql-test/r/key_cache.result b/mysql-test/r/key_cache.result
index eeb838dc72c..1580f51975e 100644
--- a/mysql-test/r/key_cache.result
+++ b/mysql-test/r/key_cache.result
@@ -88,11 +88,9 @@ create table t2 (p int primary key, i int, a char(10), key k1(i), key k2(a));
show status like 'key_blocks_used';
Variable_name Value
Key_blocks_used 0
-show status like 'The below may fail on 64-bit systems (ingo)';
-Variable_name Value
show status like 'key_blocks_unused';
Variable_name Value
-Key_blocks_unused 1812
+Key_blocks_unused KEY_BLOCKS_UNUSED
insert into t1 values (1, 'qqqq'), (11, 'yyyy');
insert into t2 values (1, 1, 'qqqq'), (2, 1, 'pppp'),
(3, 1, 'yyyy'), (4, 3, 'zzzz');
@@ -111,11 +109,9 @@ update t2 set i=2 where i=1;
show status like 'key_blocks_used';
Variable_name Value
Key_blocks_used 4
-show status like 'The below may fail on 64-bit systems (ingo)';
-Variable_name Value
show status like 'key_blocks_unused';
Variable_name Value
-Key_blocks_unused 1808
+Key_blocks_unused KEY_BLOCKS_UNUSED
cache index t1 key (`primary`) in keycache1;
Table Op Msg_type Msg_text
test.t1 assign_to_keycache status OK
@@ -275,11 +271,9 @@ drop table t1,t2,t3;
show status like 'key_blocks_used';
Variable_name Value
Key_blocks_used 4
-show status like 'The below may fail on 64-bit systems (ingo)';
-Variable_name Value
show status like 'key_blocks_unused';
Variable_name Value
-Key_blocks_unused 1812
+Key_blocks_unused KEY_BLOCKS_UNUSED
set global keycache2.key_buffer_size=0;
set global keycache3.key_buffer_size=100;
set global keycache3.key_buffer_size=0;
diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test
index 24753c28073..c4413c3ef3f 100644
--- a/mysql-test/t/func_str.test
+++ b/mysql-test/t/func_str.test
@@ -385,8 +385,9 @@ drop table t1, t2;
# Test case for conversion of long string value to integer (Bug #3472)
#
-create table t1 (c1 INT);
-insert into t1 (c1) values ('21474836461');
+create table t1 (c1 INT, c2 INT UNSIGNED);
+insert into t1 values ('21474836461','21474836461');
+insert into t1 values ('-21474836461','-21474836461');
show warnings;
select * from t1;
drop table t1;
diff --git a/mysql-test/t/key_cache.test b/mysql-test/t/key_cache.test
index ca846a31def..b45df8eb58e 100644
--- a/mysql-test/t/key_cache.test
+++ b/mysql-test/t/key_cache.test
@@ -67,8 +67,12 @@ create table t1 (p int primary key, a char(10)) delay_key_write=1;
create table t2 (p int primary key, i int, a char(10), key k1(i), key k2(a));
show status like 'key_blocks_used';
-show status like 'The below may fail on 64-bit systems (ingo)';
-show status like 'key_blocks_unused'; # This may fail on 64-bit systems (ingo)
+
+# Following results differs on 64 and 32 bit systems because of different
+# pointer sizes, which takes up different amount of space in key cache
+
+--replace_result 1812 KEY_BLOCKS_UNUSED 1793 KEY_BLOCKS_UNUSED
+show status like 'key_blocks_unused';
insert into t1 values (1, 'qqqq'), (11, 'yyyy');
insert into t2 values (1, 1, 'qqqq'), (2, 1, 'pppp'),
@@ -80,8 +84,8 @@ update t1 set p=2 where p=1;
update t2 set i=2 where i=1;
show status like 'key_blocks_used';
-show status like 'The below may fail on 64-bit systems (ingo)';
-show status like 'key_blocks_unused'; # This may fail on 64-bit systems (ingo)
+--replace_result 1808 KEY_BLOCKS_UNUSED 1789 KEY_BLOCKS_UNUSED
+show status like 'key_blocks_unused';
cache index t1 key (`primary`) in keycache1;
@@ -142,8 +146,8 @@ cache index t1,t2 in default;
drop table t1,t2,t3;
show status like 'key_blocks_used';
-show status like 'The below may fail on 64-bit systems (ingo)';
-show status like 'key_blocks_unused'; # This may fail on 64-bit systems (ingo)
+--replace_result 1812 KEY_BLOCKS_UNUSED 1793 KEY_BLOCKS_UNUSED
+show status like 'key_blocks_unused';
# Cleanup
# We don't reset keycache2 as we want to ensure that mysqld will reset it
diff --git a/sql/item.cc b/sql/item.cc
index 2dabb8e26ef..11a9e88bdd6 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -503,6 +503,22 @@ Item *Item_field::get_tmp_table_item(THD *thd)
}
+/*
+ Create an item from a string we KNOW points to a valid longlong/ulonglong
+ end \0 terminated number string
+*/
+
+Item_int::Item_int(const char *str_arg, uint length)
+{
+ char *end_ptr= (char*) str_arg + length;
+ int error;
+ value= my_strtoll10(str_arg, &end_ptr, &error);
+ max_length= (uint) (end_ptr - str_arg);
+ name= (char*) str_arg;
+ fixed= 1;
+}
+
+
String *Item_int::val_str(String *str)
{
// following assert is redundant, because fixed=1 assigned in constructor
@@ -519,6 +535,13 @@ void Item_int::print(String *str)
}
+Item_uint::Item_uint(const char *str_arg, uint length):
+ Item_int(str_arg, length)
+{
+ unsigned_flag= 1;
+}
+
+
String *Item_uint::val_str(String *str)
{
// following assert is redundant, because fixed=1 assigned in constructor
diff --git a/sql/item.h b/sql/item.h
index 780e2fcadac..99a0516e439 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -456,10 +456,7 @@ public:
#endif
Item_int(const char *str_arg,longlong i,uint length) :value(i)
{ max_length=length; name=(char*) str_arg; fixed= 1; }
- Item_int(const char *str_arg) :
- value(str_arg[0] == '-' ? strtoll(str_arg,(char**) 0,10) :
- (longlong) strtoull(str_arg,(char**) 0,10))
- { max_length= (uint) strlen(str_arg); name=(char*) str_arg; fixed= 1; }
+ Item_int(const char *str_arg, uint length=64);
enum Type type() const { return INT_ITEM; }
enum Item_result result_type () const { return INT_RESULT; }
enum_field_types field_type() const { return MYSQL_TYPE_LONGLONG; }
@@ -479,9 +476,7 @@ public:
class Item_uint :public Item_int
{
public:
- Item_uint(const char *str_arg, uint length) :
- Item_int(str_arg, (longlong) strtoull(str_arg, (char**) 0,10), length)
- { unsigned_flag= 1; }
+ Item_uint(const char *str_arg, uint length);
Item_uint(uint32 i) :Item_int((longlong) i, 10)
{ unsigned_flag= 1; }
double val()
diff --git a/sql/item_sum.h b/sql/item_sum.h
index d7753303f55..4cded41a9f6 100644
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@ -735,8 +735,12 @@ class Item_func_group_concat : public Item_sum
}
longlong val_int()
{
- String *res; res=val_str(&str_value);
- return res ? strtoll(res->c_ptr(),(char**) 0,10) : (longlong) 0;
+ String *res;
+ char *end_ptr;
+ int error;
+ res= val_str(&str_value);
+ end_ptr= (char*) res->ptr()+ res->length();
+ return res ? my_strtoll10(res->ptr(), &end_ptr, &error) : (longlong) 0;
}
String* val_str(String* str);
Item *copy_or_same(THD* thd);
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc
index 0c0b5265db7..e8848243812 100644
--- a/sql/item_timefunc.cc
+++ b/sql/item_timefunc.cc
@@ -1666,7 +1666,7 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
days--;
sec+= 3600*LL(24);
}
- ltime->second_part= microseconds;
+ ltime->second_part= (uint) microseconds;
ltime->second= (uint) (sec % 60);
ltime->minute= (uint) (sec/60 % 60);
ltime->hour= (uint) (sec/3600);
diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c
index c8eb3c07a3f..ba1fc1c424a 100644
--- a/strings/ctype-simple.c
+++ b/strings/ctype-simple.c
@@ -235,9 +235,9 @@ long my_strntol_8bit(CHARSET_INFO *cs,
char **endptr, int *err)
{
int negative;
- register ulong cutoff;
+ register uint32 cutoff;
register unsigned int cutlim;
- register ulong i;
+ register uint32 i;
register const char *s;
register unsigned char c;
const char *save, *e;
@@ -297,8 +297,8 @@ long my_strntol_8bit(CHARSET_INFO *cs,
#endif
save = s;
- cutoff = ((ulong)~0L) / (unsigned long int) base;
- cutlim = (uint) (((ulong)~0L) % (unsigned long int) base);
+ cutoff = ((uint32)~0L) / (uint32) base;
+ cutlim = (uint) (((uint32)~0L) % (uint32) base);
overflow = 0;
i = 0;
@@ -318,7 +318,7 @@ long my_strntol_8bit(CHARSET_INFO *cs,
overflow = 1;
else
{
- i *= (ulong) base;
+ i *= (uint32) base;
i += c;
}
}
@@ -331,16 +331,16 @@ long my_strntol_8bit(CHARSET_INFO *cs,
if (negative)
{
- if (i > (ulong) LONG_MIN)
+ if (i > (uint32) INT_MIN32)
overflow = 1;
}
- else if (i > (ulong) LONG_MAX)
+ else if (i > INT_MAX32)
overflow = 1;
if (overflow)
{
err[0]= ERANGE;
- return negative ? LONG_MIN : LONG_MAX;
+ return negative ? INT_MIN32 : INT_MAX32;
}
return (negative ? -((long) i) : (long) i);
@@ -358,9 +358,9 @@ ulong my_strntoul_8bit(CHARSET_INFO *cs,
char **endptr, int *err)
{
int negative;
- register ulong cutoff;
+ register uint32 cutoff;
register unsigned int cutlim;
- register ulong i;
+ register uint32 i;
register const char *s;
register unsigned char c;
const char *save, *e;
@@ -419,8 +419,8 @@ ulong my_strntoul_8bit(CHARSET_INFO *cs,
#endif
save = s;
- cutoff = ((ulong)~0L) / (unsigned long int) base;
- cutlim = (uint) (((ulong)~0L) % (unsigned long int) base);
+ cutoff = ((uint32)~0L) / (uint32) base;
+ cutlim = (uint) (((uint32)~0L) % (uint32) base);
overflow = 0;
i = 0;
@@ -440,7 +440,7 @@ ulong my_strntoul_8bit(CHARSET_INFO *cs,
overflow = 1;
else
{
- i *= (ulong) base;
+ i *= (uint32) base;
i += c;
}
}
@@ -454,7 +454,7 @@ ulong my_strntoul_8bit(CHARSET_INFO *cs,
if (overflow)
{
err[0]= ERANGE;
- return ((ulong)~0L);
+ return (~(uint32) 0);
}
return (negative ? -((long) i) : (long) i);
diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c
index 99d97a9614b..59c1706fd26 100644
--- a/strings/ctype-ucs2.c
+++ b/strings/ctype-ucs2.c
@@ -406,8 +406,8 @@ long my_strntol_ucs2(CHARSET_INFO *cs,
int cnv;
my_wc_t wc;
register unsigned int cutlim;
- register ulong cutoff;
- register ulong res;
+ register uint32 cutoff;
+ register uint32 res;
register const uchar *s= (const uchar*) nptr;
register const uchar *e= (const uchar*) nptr+l;
const uchar *save;
@@ -446,8 +446,8 @@ bs:
overflow = 0;
res = 0;
save = s;
- cutoff = ((ulong)~0L) / (unsigned long int) base;
- cutlim = (uint) (((ulong)~0L) % (unsigned long int) base);
+ cutoff = ((uint32)~0L) / (uint32) base;
+ cutlim = (uint) (((uint32)~0L) % (uint32) base);
do {
if ((cnv=cs->cset->mb_wc(cs,&wc,s,e))>0)
@@ -467,7 +467,7 @@ bs:
overflow = 1;
else
{
- res *= (ulong) base;
+ res *= (uint32) base;
res += wc;
}
}
@@ -496,16 +496,16 @@ bs:
if (negative)
{
- if (res > (ulong) LONG_MIN)
+ if (res > (uint32) INT_MIN32)
overflow = 1;
}
- else if (res > (ulong) LONG_MAX)
+ else if (res > INT_MAX32)
overflow = 1;
if (overflow)
{
err[0]=ERANGE;
- return negative ? LONG_MIN : LONG_MAX;
+ return negative ? INT_MIN32 : INT_MAX32;
}
return (negative ? -((long) res) : (long) res);
@@ -521,8 +521,8 @@ ulong my_strntoul_ucs2(CHARSET_INFO *cs,
int cnv;
my_wc_t wc;
register unsigned int cutlim;
- register ulong cutoff;
- register ulong res;
+ register uint32 cutoff;
+ register uint32 res;
register const uchar *s= (const uchar*) nptr;
register const uchar *e= (const uchar*) nptr+l;
const uchar *save;
@@ -561,8 +561,8 @@ bs:
overflow = 0;
res = 0;
save = s;
- cutoff = ((ulong)~0L) / (unsigned long int) base;
- cutlim = (uint) (((ulong)~0L) % (unsigned long int) base);
+ cutoff = ((uint32)~0L) / (uint32) base;
+ cutlim = (uint) (((uint32)~0L) % (uint32) base);
do
{
@@ -583,7 +583,7 @@ bs:
overflow = 1;
else
{
- res *= (ulong) base;
+ res *= (uint32) base;
res += wc;
}
}
@@ -613,11 +613,10 @@ bs:
if (overflow)
{
err[0]=(ERANGE);
- return ((ulong)~0L);
+ return (~(uint32) 0);
}
return (negative ? -((long) res) : (long) res);
-
}