Merge marko@build.mysql.com:/home/bk/mysql-4.1

into hundin.mysql.fi:/home/marko/j/mysql-4.1


sql/sql_table.cc:
  Auto merged
This commit is contained in:
unknown 2004-05-07 12:48:01 +03:00
commit 6b313c6998
41 changed files with 266 additions and 137 deletions

View File

@ -160,6 +160,10 @@ SOURCE="..\strings\ctype-tis620.c"
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE="..\strings\ctype-uca.c"
# End Source File
# Begin Source File
SOURCE="..\strings\ctype-ucs2.c" SOURCE="..\strings\ctype-ucs2.c"
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -510,10 +514,6 @@ SOURCE=..\strings\strxnmov.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\strings\strxnmov.c
# End Source File
# Begin Source File
SOURCE=..\mysys\thr_mutex.c SOURCE=..\mysys\thr_mutex.c
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -179,6 +179,10 @@ SOURCE="..\strings\ctype-tis620.c"
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE="..\strings\ctype-uca.c"
# End Source File
# Begin Source File
SOURCE="..\strings\ctype-ucs2.c" SOURCE="..\strings\ctype-ucs2.c"
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -50,7 +50,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib setargv.obj /nologo /subsystem:console /machine:I386 /out:"../client_release/myisam_ftdump.exe" # ADD LINK32 wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib setargv.obj ..\lib_release\zlib.lib /nologo /subsystem:console /machine:I386 /out:"../client_release/myisam_ftdump.exe"
!ELSEIF "$(CFG)" == "myisam_ftdump - Win32 Debug" !ELSEIF "$(CFG)" == "myisam_ftdump - Win32 Debug"
@ -75,7 +75,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib wsock32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib setargv.obj /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../client_debug/myisam_ftdump.exe" /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib wsock32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib setargv.obj ..\lib_debug\zlib.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../client_debug/myisam_ftdump.exe" /pdbtype:sept
!ENDIF !ENDIF

View File

@ -218,6 +218,10 @@ SOURCE=.\derror.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\discover.cpp
# End Source File
# Begin Source File
SOURCE=..\libmysql\errmsg.c SOURCE=..\libmysql\errmsg.c
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -151,6 +151,10 @@ SOURCE=".\ctype-sjis.c"
SOURCE=".\ctype-tis620.c" SOURCE=".\ctype-tis620.c"
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=".\ctype-uca.c"
# End Source File
# Begin Source File
SOURCE=".\ctype-ucs2.c" SOURCE=".\ctype-ucs2.c"
# End Source File # End Source File

View File

@ -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) # isinf() could be a function or a macro (HPUX)
AC_MSG_CHECKING(for isinf with <math.h>) AC_MSG_CHECKING(for isinf with <math.h>)
AC_TRY_LINK([#include <math.h>], [float f = 0.0; isinf(f)], 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)) AC_MSG_RESULT(no))
CFLAGS="$ORG_CFLAGS" CFLAGS="$ORG_CFLAGS"

View File

@ -49,7 +49,7 @@ static struct my_option my_long_options[] =
{"help", '?', "Display this help message and exit.", {"help", '?', "Display this help message and exit.",
0, 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},
{"verbose", 'v', "Increase the output level", {"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.", {"version", 'V', "Output version information and exit.",
0, 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},
{0, 0, 0, 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}

View File

@ -674,7 +674,7 @@ typedef SOCKET_SIZE_TYPE size_socket;
#define FLT_MAX ((float)3.40282346638528860e+38) #define FLT_MAX ((float)3.40282346638528860e+38)
#endif #endif
#ifndef HAVE_ISINF #if !defined(HAVE_ISINF) && !defined(isinf)
#define isinf(X) 0 #define isinf(X) 0
#endif #endif

View File

@ -358,6 +358,14 @@ os_file_set_size(
size */ size */
ulint size_high);/* in: most significant 32 bits of size */ ulint size_high);/* in: most significant 32 bits of size */
/*************************************************************************** /***************************************************************************
Truncates a file at its current position. */
ibool
os_file_set_eof(
/*============*/
/* out: TRUE if success */
FILE* file); /* in: file to be truncated */
/***************************************************************************
Flushes the write buffers of a given file to the disk. */ Flushes the write buffers of a given file to the disk. */
ibool ibool

View File

@ -1582,6 +1582,23 @@ error_handling:
return(FALSE); return(FALSE);
} }
/***************************************************************************
Truncates a file at its current position. */
ibool
os_file_set_eof(
/*============*/
/* out: TRUE if success */
FILE* file) /* in: file to be truncated */
{
#ifdef __WIN__
HANDLE h = (HANDLE) _get_osfhandle(fileno(file));
return(SetEndOfFile(h));
#else /* __WIN__ */
return(!ftruncate(fileno(file), ftell(file)));
#endif /* __WIN__ */
}
/*************************************************************************** /***************************************************************************
Flushes the write buffers of a given file to the disk. */ Flushes the write buffers of a given file to the disk. */

View File

@ -1655,11 +1655,7 @@ loop:
mutex_enter(&srv_monitor_file_mutex); mutex_enter(&srv_monitor_file_mutex);
rewind(srv_monitor_file); rewind(srv_monitor_file);
srv_printf_innodb_monitor(srv_monitor_file); srv_printf_innodb_monitor(srv_monitor_file);
#ifdef __WIN__ os_file_set_eof(srv_monitor_file);
chsize(fileno(srv_monitor_file), ftell(srv_monitor_file));
#else /* __WIN__ */
ftruncate(fileno(srv_monitor_file), ftell(srv_monitor_file));
#endif /* __WIN__ */
mutex_exit(&srv_monitor_file_mutex); mutex_exit(&srv_monitor_file_mutex);
if (srv_print_innodb_tablespace_monitor if (srv_print_innodb_tablespace_monitor

View File

@ -62,10 +62,4 @@ int cli_read_change_user_result(MYSQL *mysql, char *buff, const char *passwd);
#ifdef EMBEDDED_LIBRARY #ifdef EMBEDDED_LIBRARY
int init_embedded_server(int argc, char **argv, char **groups); int init_embedded_server(int argc, char **argv, char **groups);
void end_embedded_server(); 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*/ #endif /*EMBEDDED_LIBRARY*/

View File

@ -113,7 +113,9 @@ static my_bool org_my_init_done= 0;
1 could not initialize environment (out of memory or thread keys) 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; int result= 0;
if (!mysql_client_init) if (!mysql_client_init)
@ -152,7 +154,9 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
#if defined(SIGPIPE) && !defined(__WIN__) #if defined(SIGPIPE) && !defined(__WIN__)
(void) signal(SIGPIPE, SIG_IGN); (void) signal(SIGPIPE, SIG_IGN);
#endif #endif
#ifdef EMBEDDED_LIBRARY
result= init_embedded_server(argc, argv, groups); result= init_embedded_server(argc, argv, groups);
#endif
} }
#ifdef THREAD #ifdef THREAD
else else
@ -164,7 +168,9 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
void STDCALL mysql_server_end() void STDCALL mysql_server_end()
{ {
#ifdef EMBEDDED_LIBRARY
end_embedded_server(); end_embedded_server();
#endif
/* If library called my_init(), free memory allocated by it */ /* If library called my_init(), free memory allocated by it */
if (!org_my_init_done) if (!org_my_init_done)
{ {
@ -3992,7 +3998,8 @@ my_bool STDCALL mysql_stmt_reset(MYSQL_STMT *stmt)
mysql= stmt->mysql->last_used_con; mysql= stmt->mysql->last_used_con;
int4store(buff, stmt->stmt_id); /* Send stmt id to server */ int4store(buff, stmt->stmt_id); /* Send stmt id to server */
if ((*mysql->methods->advanced_command)(mysql, COM_RESET_STMT,buff,MYSQL_STMT_HEADER,0,0,1)) if ((*mysql->methods->advanced_command)(mysql, COM_RESET_STMT, buff,
MYSQL_STMT_HEADER,0,0,0))
{ {
set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno, set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno,
mysql->net.sqlstate); mysql->net.sqlstate);
@ -4054,7 +4061,9 @@ static void stmt_update_metadata(MYSQL_STMT *stmt, MYSQL_ROWS *data)
MYSQL_FIELD *field; MYSQL_FIELD *field;
uchar *null_ptr, bit; uchar *null_ptr, bit;
uchar *row= (uchar*) data->data; uchar *row= (uchar*) data->data;
#ifndef DBUG_OFF
uchar *row_end= row + data->length; uchar *row_end= row + data->length;
#endif
null_ptr= row; null_ptr= row;
row+= (stmt->field_count+9)/8; /* skip null bits */ row+= (stmt->field_count+9)/8; /* skip null bits */

View File

@ -639,14 +639,21 @@ name
aaaaaaaaaaccccc aaaaaaaaaaccccc
bbbbbbbbbbddddd bbbbbbbbbbddddd
drop table t1, t2; drop table t1, t2;
create table t1 (c1 INT); create table t1 (c1 INT, c2 INT UNSIGNED);
insert into t1 (c1) values ('21474836461'); insert into t1 values ('21474836461','21474836461');
Warnings: Warnings:
Warning 1265 Data truncated for column 'c1' at row 1 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; show warnings;
Level Code Message Level Code Message
Warning 1265 Data truncated for column 'c1' at row 1 Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
select * from t1; select * from t1;
c1 c1 c2
2147483647 2147483647 4294967295
-2147483648 0
drop table t1; drop table t1;

View File

@ -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'; show status like 'key_blocks_used';
Variable_name Value Variable_name Value
Key_blocks_used 0 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'; show status like 'key_blocks_unused';
Variable_name Value Variable_name Value
Key_blocks_unused 1812 Key_blocks_unused KEY_BLOCKS_UNUSED
insert into t1 values (1, 'qqqq'), (11, 'yyyy'); insert into t1 values (1, 'qqqq'), (11, 'yyyy');
insert into t2 values (1, 1, 'qqqq'), (2, 1, 'pppp'), insert into t2 values (1, 1, 'qqqq'), (2, 1, 'pppp'),
(3, 1, 'yyyy'), (4, 3, 'zzzz'); (3, 1, 'yyyy'), (4, 3, 'zzzz');
@ -111,11 +109,9 @@ update t2 set i=2 where i=1;
show status like 'key_blocks_used'; show status like 'key_blocks_used';
Variable_name Value Variable_name Value
Key_blocks_used 4 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'; show status like 'key_blocks_unused';
Variable_name Value Variable_name Value
Key_blocks_unused 1808 Key_blocks_unused KEY_BLOCKS_UNUSED
cache index t1 key (`primary`) in keycache1; cache index t1 key (`primary`) in keycache1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 assign_to_keycache status OK test.t1 assign_to_keycache status OK
@ -275,11 +271,9 @@ drop table t1,t2,t3;
show status like 'key_blocks_used'; show status like 'key_blocks_used';
Variable_name Value Variable_name Value
Key_blocks_used 4 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'; show status like 'key_blocks_unused';
Variable_name Value Variable_name Value
Key_blocks_unused 1812 Key_blocks_unused KEY_BLOCKS_UNUSED
set global keycache2.key_buffer_size=0; set global keycache2.key_buffer_size=0;
set global keycache3.key_buffer_size=100; set global keycache3.key_buffer_size=100;
set global keycache3.key_buffer_size=0; set global keycache3.key_buffer_size=0;

View File

@ -20,4 +20,5 @@ select * from t1;
n n
1 1
1 1
stop slave;
drop table t1; drop table t1;

View File

@ -385,8 +385,9 @@ drop table t1, t2;
# Test case for conversion of long string value to integer (Bug #3472) # Test case for conversion of long string value to integer (Bug #3472)
# #
create table t1 (c1 INT); create table t1 (c1 INT, c2 INT UNSIGNED);
insert into t1 (c1) values ('21474836461'); insert into t1 values ('21474836461','21474836461');
insert into t1 values ('-21474836461','-21474836461');
show warnings; show warnings;
select * from t1; select * from t1;
drop table t1; drop table t1;

View File

@ -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)); 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 '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 t1 values (1, 'qqqq'), (11, 'yyyy');
insert into t2 values (1, 1, 'qqqq'), (2, 1, 'pppp'), 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; update t2 set i=2 where i=1;
show status like 'key_blocks_used'; show status like 'key_blocks_used';
show status like 'The below may fail on 64-bit systems (ingo)'; --replace_result 1808 KEY_BLOCKS_UNUSED 1789 KEY_BLOCKS_UNUSED
show status like 'key_blocks_unused'; # This may fail on 64-bit systems (ingo) show status like 'key_blocks_unused';
cache index t1 key (`primary`) in keycache1; cache index t1 key (`primary`) in keycache1;
@ -142,8 +146,8 @@ cache index t1,t2 in default;
drop table t1,t2,t3; drop table t1,t2,t3;
show status like 'key_blocks_used'; show status like 'key_blocks_used';
show status like 'The below may fail on 64-bit systems (ingo)'; --replace_result 1812 KEY_BLOCKS_UNUSED 1793 KEY_BLOCKS_UNUSED
show status like 'key_blocks_unused'; # This may fail on 64-bit systems (ingo) show status like 'key_blocks_unused';
# Cleanup # Cleanup
# We don't reset keycache2 as we want to ensure that mysqld will reset it # We don't reset keycache2 as we want to ensure that mysqld will reset it

View File

@ -18,4 +18,8 @@ insert into t1 values (1);
save_master_pos; save_master_pos;
sync_with_master; sync_with_master;
select * from t1; # check that indeed 2 were inserted select * from t1; # check that indeed 2 were inserted
# We stop the slave before cleaning up otherwise we'll get
# 'drop table t1' executed twice, so an error in the slave.err
# (not critical).
stop slave;
drop table t1; drop table t1;

View File

@ -4817,7 +4817,7 @@ innodb_show_status(
rewind(srv_monitor_file); rewind(srv_monitor_file);
srv_printf_innodb_monitor(srv_monitor_file); srv_printf_innodb_monitor(srv_monitor_file);
flen = ftell(srv_monitor_file); flen = ftell(srv_monitor_file);
my_chsize(fileno(srv_monitor_file), flen, 0, MYF(0)); os_file_set_eof(srv_monitor_file);
if(flen > 64000 - 1) { if(flen > 64000 - 1) {
flen = 64000 - 1; flen = 64000 - 1;
} }

View File

@ -322,11 +322,11 @@ public:
{ {
return (my_errno=HA_ERR_WRONG_COMMAND); return (my_errno=HA_ERR_WRONG_COMMAND);
} }
virtual int handler::read_range_first(const key_range *start_key, virtual int read_range_first(const key_range *start_key,
const key_range *end_key, const key_range *end_key,
bool sorted); bool sorted);
virtual int handler::read_range_next(bool eq_range); virtual int read_range_next(bool eq_range);
int handler::compare_key(key_range *range); int compare_key(key_range *range);
virtual int ft_init() virtual int ft_init()
{ return -1; } { return -1; }
virtual FT_INFO *ft_init_ext(uint flags,uint inx,const byte *key, uint keylen) virtual FT_INFO *ft_init_ext(uint flags,uint inx,const byte *key, uint keylen)

View File

@ -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) String *Item_int::val_str(String *str)
{ {
// following assert is redundant, because fixed=1 assigned in constructor // 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) String *Item_uint::val_str(String *str)
{ {
// following assert is redundant, because fixed=1 assigned in constructor // following assert is redundant, because fixed=1 assigned in constructor

View File

@ -456,10 +456,7 @@ public:
#endif #endif
Item_int(const char *str_arg,longlong i,uint length) :value(i) Item_int(const char *str_arg,longlong i,uint length) :value(i)
{ max_length=length; name=(char*) str_arg; fixed= 1; } { max_length=length; name=(char*) str_arg; fixed= 1; }
Item_int(const char *str_arg) : Item_int(const char *str_arg, uint length=64);
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; }
enum Type type() const { return INT_ITEM; } enum Type type() const { return INT_ITEM; }
enum Item_result result_type () const { return INT_RESULT; } enum Item_result result_type () const { return INT_RESULT; }
enum_field_types field_type() const { return MYSQL_TYPE_LONGLONG; } enum_field_types field_type() const { return MYSQL_TYPE_LONGLONG; }
@ -479,9 +476,7 @@ public:
class Item_uint :public Item_int class Item_uint :public Item_int
{ {
public: public:
Item_uint(const char *str_arg, uint length) : 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(uint32 i) :Item_int((longlong) i, 10) Item_uint(uint32 i) :Item_int((longlong) i, 10)
{ unsigned_flag= 1; } { unsigned_flag= 1; }
double val() double val()

View File

@ -96,7 +96,8 @@ protected:
bool save_cache; bool save_cache;
public: public:
Item_in_optimizer(Item *a, Item_in_subselect *b): Item_in_optimizer(Item *a, Item_in_subselect *b):
Item_bool_func(a, (Item *)b), cache(0), save_cache(0) {} Item_bool_func(a, my_reinterpret_cast(Item *)(b)), cache(0), save_cache(0)
{}
bool fix_fields(THD *, struct st_table_list *, Item **); bool fix_fields(THD *, struct st_table_list *, Item **);
bool fix_left(THD *thd, struct st_table_list *tables, Item **ref); bool fix_left(THD *thd, struct st_table_list *tables, Item **ref);
bool is_null(); bool is_null();

View File

@ -140,7 +140,7 @@ public:
void fix_length_and_dec(); void fix_length_and_dec();
uint cols(); uint cols();
Item* el(uint i) { return (Item*)row[i]; } Item* el(uint i) { return my_reinterpret_cast(Item*)(row[i]); }
Item** addr(uint i) { return (Item**)row + i; } Item** addr(uint i) { return (Item**)row + i; }
bool check_cols(uint c); bool check_cols(uint c);
bool null_inside(); bool null_inside();

View File

@ -735,8 +735,12 @@ class Item_func_group_concat : public Item_sum
} }
longlong val_int() longlong val_int()
{ {
String *res; res=val_str(&str_value); String *res;
return res ? strtoll(res->c_ptr(),(char**) 0,10) : (longlong) 0; 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); String* val_str(String* str);
Item *copy_or_same(THD* thd); Item *copy_or_same(THD* thd);

View File

@ -1666,7 +1666,7 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
days--; days--;
sec+= 3600*LL(24); sec+= 3600*LL(24);
} }
ltime->second_part= microseconds; ltime->second_part= (uint) microseconds;
ltime->second= (uint) (sec % 60); ltime->second= (uint) (sec % 60);
ltime->minute= (uint) (sec/60 % 60); ltime->minute= (uint) (sec/60 % 60);
ltime->hour= (uint) (sec/3600); ltime->hour= (uint) (sec/3600);

View File

@ -853,7 +853,7 @@ bool update_sys_var_str(sys_var_str *var_str, rw_lock_t *var_mutex,
uint new_length= (var ? var->value->str_value.length() : 0); uint new_length= (var ? var->value->str_value.length() : 0);
if (!old_value) if (!old_value)
old_value= (char*) ""; old_value= (char*) "";
if (!(res= my_strdup_with_length(old_value, new_length, MYF(0)))) if (!(res= my_strdup_with_length((byte*)old_value, new_length, MYF(0))))
return 1; return 1;
/* /*
Replace the old value in such a way that the any thread using Replace the old value in such a way that the any thread using

View File

@ -36,7 +36,7 @@ To make maintaining easier please:
<alias>iso_8859-2</alias> <alias>iso_8859-2</alias>
<alias>iso_8859-2:1987</alias> <alias>iso_8859-2:1987</alias>
<alias>l2</alias> <alias>l2</alias>
<collation name="latin2_czech_ci" id="2" order="Czech" flag="compiled"/> <collation name="latin2_czech_cs" id="2" order="Czech" flag="compiled"/>
<collation name="latin2_general_ci" id="9" flag="primary"> <collation name="latin2_general_ci" id="9" flag="primary">
<order>Hungarian</order> <order>Hungarian</order>
<order>Polish</order> <order>Polish</order>
@ -349,7 +349,7 @@ To make maintaining easier please:
<order>Slovenian</order> <order>Slovenian</order>
<order>Sorbian</order> <order>Sorbian</order>
</collation> </collation>
<collation name="cp1250_czech_ci" id="34" order="Czech"> <collation name="cp1250_czech_cs" id="34" order="Czech">
<flag>compiled</flag> <flag>compiled</flag>
</collation> </collation>
<collation name="cp1250_bin" id="66" order="Binary" flag="binary"/> <collation name="cp1250_bin" id="66" order="Binary" flag="binary"/>

View File

@ -217,7 +217,7 @@ public:
if (!(ci= find_class((int) type_id))) if (!(ci= find_class((int) type_id)))
return NULL; return NULL;
(*ci->m_create_func)((void *)buffer); (*ci->m_create_func)((void *)buffer);
return (Geometry *)buffer; return my_reinterpret_cast(Geometry *)(buffer);
} }
static Geometry *create_from_wkb(Geometry_buffer *buffer, static Geometry *create_from_wkb(Geometry_buffer *buffer,

View File

@ -2764,9 +2764,9 @@ bool check_grant_column(THD *thd,TABLE *table, const char *name,
if (table->grant.version != grant_version) if (table->grant.version != grant_version)
{ {
table->grant.grant_table= table->grant.grant_table=
table_hash_search(thd->host,thd->ip,thd->db, table_hash_search(thd->host, thd->ip, table->table_cache_key,
thd->priv_user, thd->priv_user,
table->real_name,0); /* purecov: inspected */ table->real_name, 0); /* purecov: inspected */
table->grant.version=grant_version; /* purecov: inspected */ table->grant.version=grant_version; /* purecov: inspected */
} }
if (!(grant_table=table->grant.grant_table)) if (!(grant_table=table->grant.grant_table))
@ -3161,7 +3161,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user)
/* Add database access */ /* Add database access */
for (counter=0 ; counter < acl_dbs.elements ; counter++) for (counter=0 ; counter < acl_dbs.elements ; counter++)
{ {
const char *user,*host; const char *user, *host;
acl_db=dynamic_element(&acl_dbs,counter,ACL_DB*); acl_db=dynamic_element(&acl_dbs,counter,ACL_DB*);
if (!(user=acl_db->user)) if (!(user=acl_db->user))

View File

@ -661,7 +661,7 @@ void query_cache_end_of_result(THD *thd)
if (thd->net.query_cache_query != 0) // Quick check on unlocked structure if (thd->net.query_cache_query != 0) // Quick check on unlocked structure
{ {
#ifdef EMBEDDED_LIBRARY #ifdef EMBEDDED_LIBRARY
query_cache_insert(&thd->net, (byte*)thd, query_cache_insert(&thd->net, (char*)thd,
emb_count_querycache_size(thd)); emb_count_querycache_size(thd));
#endif #endif
STRUCT_LOCK(&query_cache.structure_guard_mutex); STRUCT_LOCK(&query_cache.structure_guard_mutex);

View File

@ -332,7 +332,10 @@ public:
Item_subselect *item; Item_subselect *item;
/* thread handler */ /* thread handler */
THD *thd; THD *thd;
/* fake SELECT_LEX for union processing */ /*
SELECT_LEX for hidden SELECT in onion which process global
ORDER BY and LIMIT
*/
st_select_lex *fake_select_lex; st_select_lex *fake_select_lex;
st_select_lex *union_distinct; /* pointer to the last UNION DISTINCT */ st_select_lex *union_distinct; /* pointer to the last UNION DISTINCT */
@ -341,12 +344,18 @@ public:
bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result); bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result);
st_select_lex_unit* master_unit(); st_select_lex_unit* master_unit();
st_select_lex* outer_select(); st_select_lex* outer_select();
st_select_lex* first_select() { return (st_select_lex*) slave; } st_select_lex* first_select()
{
return my_reinterpret_cast(st_select_lex*)(slave);
}
st_select_lex* first_select_in_union() st_select_lex* first_select_in_union()
{ {
return (st_select_lex*) slave; return my_reinterpret_cast(st_select_lex*)(slave);
}
st_select_lex_unit* next_unit()
{
return my_reinterpret_cast(st_select_lex_unit*)(next);
} }
st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; }
st_select_lex* return_after_parsing() { return return_to; } st_select_lex* return_after_parsing() { return return_to; }
void exclude_level(); void exclude_level();
void exclude_tree(); void exclude_tree();
@ -360,7 +369,8 @@ public:
bool check_updateable(char *db, char *table); bool check_updateable(char *db, char *table);
void print(String *str); void print(String *str);
ulong init_prepare_fake_select_lex(THD *thd);
friend void mysql_init_query(THD *thd); friend void mysql_init_query(THD *thd);
friend int subselect_union_engine::exec(); friend int subselect_union_engine::exec();

View File

@ -1555,18 +1555,20 @@ set_params_data_err:
/* /*
Reset a prepared statement, in case there was an error in send_longdata. Reset a prepared statement in case there was a recoverable error.
Note: we don't send any reply to that command.
SYNOPSIS SYNOPSIS
mysql_stmt_reset() mysql_stmt_reset()
thd Thread handle thd Thread handle
packet Packet with stmt id packet Packet with stmt id
DESCRIPTION DESCRIPTION
This function is useful when one gets an error after calling This function resets statement to the state it was right after prepare.
mysql_stmt_getlongdata() and wants to reset the handle It can be used to:
so that one can call execute again. - clear an error happened during mysql_stmt_send_long_data
See also bug #1664 - cancel long data stream for all placeholders without
having to call mysql_stmt_execute.
Sends 'OK' packet in case of success (statement was reset)
or 'ERROR' packet (unrecoverable error/statement not found/etc).
*/ */
void mysql_stmt_reset(THD *thd, char *packet) void mysql_stmt_reset(THD *thd, char *packet)
@ -1577,7 +1579,7 @@ void mysql_stmt_reset(THD *thd, char *packet)
DBUG_ENTER("mysql_stmt_reset"); DBUG_ENTER("mysql_stmt_reset");
if (!(stmt= find_prepared_statement(thd, stmt_id, "reset", DONT_SEND_ERROR))) if (!(stmt= find_prepared_statement(thd, stmt_id, "reset", SEND_ERROR)))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
stmt->get_longdata_error= 0; stmt->get_longdata_error= 0;
@ -1587,6 +1589,8 @@ void mysql_stmt_reset(THD *thd, char *packet)
mysql_stmt_send_long_data() call. mysql_stmt_send_long_data() call.
*/ */
reset_stmt_params(stmt); reset_stmt_params(stmt);
send_ok(thd);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }

View File

@ -2855,6 +2855,9 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
db_create_options=table->db_create_options & ~(HA_OPTION_PACK_RECORD); db_create_options=table->db_create_options & ~(HA_OPTION_PACK_RECORD);
my_snprintf(tmp_name, sizeof(tmp_name), "%s-%lx_%lx", tmp_file_prefix, my_snprintf(tmp_name, sizeof(tmp_name), "%s-%lx_%lx", tmp_file_prefix,
current_pid, thd->thread_id); current_pid, thd->thread_id);
/* Safety fix for innodb */
if (lower_case_table_names)
my_casedn_str(system_charset_info, tmp_name);
create_info->db_type=new_db_type; create_info->db_type=new_db_type;
if (!create_info->comment) if (!create_info->comment)
create_info->comment=table->comment; create_info->comment=table->comment;

View File

@ -106,6 +106,41 @@ bool select_union::flush()
} }
/*
initialization procedures before fake_select_lex preparation()
SYNOPSIS
st_select_lex_unit::init_prepare_fake_select_lex()
thd - thread handler
RETURN
options of SELECT
*/
ulong
st_select_lex_unit::init_prepare_fake_select_lex(THD *thd)
{
ulong options_tmp= thd->options;
thd->lex->current_select= fake_select_lex;
offset_limit_cnt= global_parameters->offset_limit;
select_limit_cnt= global_parameters->select_limit +
global_parameters->offset_limit;
if (select_limit_cnt < global_parameters->select_limit)
select_limit_cnt= HA_POS_ERROR; // no limit
if (select_limit_cnt == HA_POS_ERROR)
options_tmp&= ~OPTION_FOUND_ROWS;
else if (found_rows_for_union && !thd->lex->describe)
options_tmp|= OPTION_FOUND_ROWS;
fake_select_lex->ftfunc_list_alloc.empty();
fake_select_lex->ftfunc_list= &fake_select_lex->ftfunc_list_alloc;
fake_select_lex->table_list.link_in_list((byte *)&result_table_list,
(byte **)
&result_table_list.next);
return options_tmp;
}
int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
ulong additional_options) ulong additional_options)
{ {
@ -207,7 +242,6 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
} }
} }
item_list.empty();
// it is not single select // it is not single select
if (first_select->next_select()) if (first_select->next_select())
{ {
@ -229,6 +263,7 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
union_result->set_table(table); union_result->set_table(table);
thd_arg->lex->current_select= lex_select_save; thd_arg->lex->current_select= lex_select_save;
if (!item_list.elements)
{ {
Statement *stmt= thd->current_statement; Statement *stmt= thd->current_statement;
Statement backup; Statement backup;
@ -246,7 +281,30 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
} }
} }
if (stmt) if (stmt)
{
thd->restore_backup_item_arena(stmt, &backup); thd->restore_backup_item_arena(stmt, &backup);
/* prepare fake select to initialize it correctly */
ulong options_tmp= init_prepare_fake_select_lex(thd);
if (!(fake_select_lex->join= new JOIN(thd, item_list, thd->options,
result)))
{
fake_select_lex->table_list.empty();
DBUG_RETURN(-1);
}
fake_select_lex->item_list= item_list;
thd_arg->lex->current_select= fake_select_lex;
res= fake_select_lex->join->
prepare(&fake_select_lex->ref_pointer_array,
(TABLE_LIST*) fake_select_lex->table_list.first,
0, 0,
fake_select_lex->order_list.elements,
(ORDER*) fake_select_lex->order_list.first,
(ORDER*) NULL, NULL, (ORDER*) NULL,
fake_select_lex, this);
fake_select_lex->table_list.empty();
}
} }
} }
else else
@ -373,22 +431,7 @@ int st_select_lex_unit::exec()
if (!thd->is_fatal_error) // Check if EOM if (!thd->is_fatal_error) // Check if EOM
{ {
ulong options_tmp= thd->options; ulong options_tmp= init_prepare_fake_select_lex(thd);
thd->lex->current_select= fake_select_lex;
offset_limit_cnt= global_parameters->offset_limit;
select_limit_cnt= global_parameters->select_limit +
global_parameters->offset_limit;
if (select_limit_cnt < global_parameters->select_limit)
select_limit_cnt= HA_POS_ERROR; // no limit
if (select_limit_cnt == HA_POS_ERROR)
options_tmp&= ~OPTION_FOUND_ROWS;
else if (found_rows_for_union && !thd->lex->describe)
options_tmp|= OPTION_FOUND_ROWS;
fake_select_lex->ftfunc_list= &empty_list;
fake_select_lex->table_list.link_in_list((byte *)&result_table_list,
(byte **)
&result_table_list.next);
JOIN *join= fake_select_lex->join; JOIN *join= fake_select_lex->join;
if (!join) if (!join)
{ {

View File

@ -587,7 +587,7 @@ CHARSET_INFO my_charset_latin2_czech_ci =
2,0,0, /* number */ 2,0,0, /* number */
MY_CS_COMPILED|MY_CS_STRNXFRM, /* state */ MY_CS_COMPILED|MY_CS_STRNXFRM, /* state */
"latin2", /* cs name */ "latin2", /* cs name */
"latin2_czech_ci", /* name */ "latin2_czech_cs", /* name */
"", /* comment */ "", /* comment */
ctype_czech, ctype_czech,
to_lower_czech, to_lower_czech,

View File

@ -235,9 +235,9 @@ long my_strntol_8bit(CHARSET_INFO *cs,
char **endptr, int *err) char **endptr, int *err)
{ {
int negative; int negative;
register ulong cutoff; register uint32 cutoff;
register unsigned int cutlim; register unsigned int cutlim;
register ulong i; register uint32 i;
register const char *s; register const char *s;
register unsigned char c; register unsigned char c;
const char *save, *e; const char *save, *e;
@ -297,8 +297,8 @@ long my_strntol_8bit(CHARSET_INFO *cs,
#endif #endif
save = s; save = s;
cutoff = ((ulong)~0L) / (unsigned long int) base; cutoff = ((uint32)~0L) / (uint32) base;
cutlim = (uint) (((ulong)~0L) % (unsigned long int) base); cutlim = (uint) (((uint32)~0L) % (uint32) base);
overflow = 0; overflow = 0;
i = 0; i = 0;
@ -318,7 +318,7 @@ long my_strntol_8bit(CHARSET_INFO *cs,
overflow = 1; overflow = 1;
else else
{ {
i *= (ulong) base; i *= (uint32) base;
i += c; i += c;
} }
} }
@ -331,16 +331,16 @@ long my_strntol_8bit(CHARSET_INFO *cs,
if (negative) if (negative)
{ {
if (i > (ulong) LONG_MIN) if (i > (uint32) INT_MIN32)
overflow = 1; overflow = 1;
} }
else if (i > (ulong) LONG_MAX) else if (i > INT_MAX32)
overflow = 1; overflow = 1;
if (overflow) if (overflow)
{ {
err[0]= ERANGE; err[0]= ERANGE;
return negative ? LONG_MIN : LONG_MAX; return negative ? INT_MIN32 : INT_MAX32;
} }
return (negative ? -((long) i) : (long) i); return (negative ? -((long) i) : (long) i);
@ -358,9 +358,9 @@ ulong my_strntoul_8bit(CHARSET_INFO *cs,
char **endptr, int *err) char **endptr, int *err)
{ {
int negative; int negative;
register ulong cutoff; register uint32 cutoff;
register unsigned int cutlim; register unsigned int cutlim;
register ulong i; register uint32 i;
register const char *s; register const char *s;
register unsigned char c; register unsigned char c;
const char *save, *e; const char *save, *e;
@ -419,8 +419,8 @@ ulong my_strntoul_8bit(CHARSET_INFO *cs,
#endif #endif
save = s; save = s;
cutoff = ((ulong)~0L) / (unsigned long int) base; cutoff = ((uint32)~0L) / (uint32) base;
cutlim = (uint) (((ulong)~0L) % (unsigned long int) base); cutlim = (uint) (((uint32)~0L) % (uint32) base);
overflow = 0; overflow = 0;
i = 0; i = 0;
@ -440,7 +440,7 @@ ulong my_strntoul_8bit(CHARSET_INFO *cs,
overflow = 1; overflow = 1;
else else
{ {
i *= (ulong) base; i *= (uint32) base;
i += c; i += c;
} }
} }
@ -454,7 +454,7 @@ ulong my_strntoul_8bit(CHARSET_INFO *cs,
if (overflow) if (overflow)
{ {
err[0]= ERANGE; err[0]= ERANGE;
return ((ulong)~0L); return (~(uint32) 0);
} }
return (negative ? -((long) i) : (long) i); return (negative ? -((long) i) : (long) i);

View File

@ -406,8 +406,8 @@ long my_strntol_ucs2(CHARSET_INFO *cs,
int cnv; int cnv;
my_wc_t wc; my_wc_t wc;
register unsigned int cutlim; register unsigned int cutlim;
register ulong cutoff; register uint32 cutoff;
register ulong res; register uint32 res;
register const uchar *s= (const uchar*) nptr; register const uchar *s= (const uchar*) nptr;
register const uchar *e= (const uchar*) nptr+l; register const uchar *e= (const uchar*) nptr+l;
const uchar *save; const uchar *save;
@ -446,8 +446,8 @@ bs:
overflow = 0; overflow = 0;
res = 0; res = 0;
save = s; save = s;
cutoff = ((ulong)~0L) / (unsigned long int) base; cutoff = ((uint32)~0L) / (uint32) base;
cutlim = (uint) (((ulong)~0L) % (unsigned long int) base); cutlim = (uint) (((uint32)~0L) % (uint32) base);
do { do {
if ((cnv=cs->cset->mb_wc(cs,&wc,s,e))>0) if ((cnv=cs->cset->mb_wc(cs,&wc,s,e))>0)
@ -467,7 +467,7 @@ bs:
overflow = 1; overflow = 1;
else else
{ {
res *= (ulong) base; res *= (uint32) base;
res += wc; res += wc;
} }
} }
@ -496,16 +496,16 @@ bs:
if (negative) if (negative)
{ {
if (res > (ulong) LONG_MIN) if (res > (uint32) INT_MIN32)
overflow = 1; overflow = 1;
} }
else if (res > (ulong) LONG_MAX) else if (res > INT_MAX32)
overflow = 1; overflow = 1;
if (overflow) if (overflow)
{ {
err[0]=ERANGE; err[0]=ERANGE;
return negative ? LONG_MIN : LONG_MAX; return negative ? INT_MIN32 : INT_MAX32;
} }
return (negative ? -((long) res) : (long) res); return (negative ? -((long) res) : (long) res);
@ -521,8 +521,8 @@ ulong my_strntoul_ucs2(CHARSET_INFO *cs,
int cnv; int cnv;
my_wc_t wc; my_wc_t wc;
register unsigned int cutlim; register unsigned int cutlim;
register ulong cutoff; register uint32 cutoff;
register ulong res; register uint32 res;
register const uchar *s= (const uchar*) nptr; register const uchar *s= (const uchar*) nptr;
register const uchar *e= (const uchar*) nptr+l; register const uchar *e= (const uchar*) nptr+l;
const uchar *save; const uchar *save;
@ -561,8 +561,8 @@ bs:
overflow = 0; overflow = 0;
res = 0; res = 0;
save = s; save = s;
cutoff = ((ulong)~0L) / (unsigned long int) base; cutoff = ((uint32)~0L) / (uint32) base;
cutlim = (uint) (((ulong)~0L) % (unsigned long int) base); cutlim = (uint) (((uint32)~0L) % (uint32) base);
do do
{ {
@ -583,7 +583,7 @@ bs:
overflow = 1; overflow = 1;
else else
{ {
res *= (ulong) base; res *= (uint32) base;
res += wc; res += wc;
} }
} }
@ -613,11 +613,10 @@ bs:
if (overflow) if (overflow)
{ {
err[0]=(ERANGE); err[0]=(ERANGE);
return ((ulong)~0L); return (~(uint32) 0);
} }
return (negative ? -((long) res) : (long) res); return (negative ? -((long) res) : (long) res);
} }

View File

@ -621,7 +621,7 @@ CHARSET_INFO my_charset_cp1250_czech_ci =
34,0,0, /* number */ 34,0,0, /* number */
MY_CS_COMPILED|MY_CS_STRNXFRM, /* state */ MY_CS_COMPILED|MY_CS_STRNXFRM, /* state */
"cp1250", /* cs name */ "cp1250", /* cs name */
"cp1250_czech_ci", /* name */ "cp1250_czech_cs", /* name */
"", /* comment */ "", /* comment */
ctype_win1250ch, ctype_win1250ch,
to_lower_win1250ch, to_lower_win1250ch,

View File

@ -163,8 +163,11 @@ MYSQL_STMT *STDCALL
mysql_simple_prepare(MYSQL *mysql, const char *query) mysql_simple_prepare(MYSQL *mysql, const char *query)
{ {
MYSQL_STMT *stmt= mysql_stmt_init(mysql); MYSQL_STMT *stmt= mysql_stmt_init(mysql);
if (mysql_stmt_prepare(stmt, query, strlen(query))) if (stmt && mysql_stmt_prepare(stmt, query, strlen(query)))
{
mysql_stmt_close(stmt);
return 0; return 0;
}
return stmt; return stmt;
} }
@ -8189,10 +8192,6 @@ static void test_ts()
/* /*
Test for bug #1500. Test for bug #1500.
XXX: despite that this bug is fixed, it spots mysqld code which is not
working correctly yet: to fix all things properly we need to implement
Item::cleanup() method for all items (as described in bugs #1663 and
#1749). So don't be surprised in case valgrind barks on it.
*/ */
static void test_bug1500() static void test_bug1500()
@ -8238,7 +8237,6 @@ static void test_bug1500()
assert(1 == my_process_stmt_result(stmt)); assert(1 == my_process_stmt_result(stmt));
/* FIXME If we comment out next string server will crash :( */
mysql_stmt_close(stmt); mysql_stmt_close(stmt);
rc= mysql_query(mysql,"DROP TABLE test_bg1500"); rc= mysql_query(mysql,"DROP TABLE test_bg1500");
@ -9351,16 +9349,17 @@ static void test_bug3035()
int64_val= int64_max; int64_val= int64_max;
uint64_val= uint64_max; uint64_val= uint64_max;
mysql_stmt_execute(stmt); rc= mysql_stmt_execute(stmt);
check_execute(stmt, rc); check_execute(stmt, rc);
stmt_text= "SELECT i8, ui8, i16, ui16, i32, ui32, i64, ui64, ui64, cast(ui64 as signed),ui64, cast(ui64 as signed)" stmt_text= "SELECT i8, ui8, i16, ui16, i32, ui32, i64, ui64, ui64, "
"cast(ui64 as signed),ui64, cast(ui64 as signed)"
"FROM t1 ORDER BY id ASC"; "FROM t1 ORDER BY id ASC";
mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text)); rc= mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text));
check_execute(stmt, rc); check_execute(stmt, rc);
mysql_stmt_execute(stmt); rc= mysql_stmt_execute(stmt);
check_execute(stmt, rc); check_execute(stmt, rc);
bind_array[8].buffer_type= MYSQL_TYPE_DOUBLE; bind_array[8].buffer_type= MYSQL_TYPE_DOUBLE;