diff options
-rw-r--r-- | Docs/manual.texi | 5 | ||||
-rw-r--r-- | include/global.h | 2 | ||||
-rw-r--r-- | include/my_no_pthread.h | 2 | ||||
-rw-r--r-- | libmysql/Makefile.shared | 2 | ||||
-rw-r--r-- | mysql-test/mysql-test-run.sh | 2 | ||||
-rw-r--r-- | mysql-test/r/bigint.result | 2 | ||||
-rw-r--r-- | mysql-test/r/func_if.result | 2 | ||||
-rw-r--r-- | mysql-test/t/bigint.test | 8 | ||||
-rw-r--r-- | mysys/Makefile.am | 2 | ||||
-rw-r--r-- | mysys/my_gethostbyname.c | 6 | ||||
-rw-r--r-- | mysys/my_init.c | 3 | ||||
-rw-r--r-- | mysys/my_net.c | 5 | ||||
-rw-r--r-- | mysys/my_os2cond.c | 24 | ||||
-rw-r--r-- | mysys/my_os2dirsrch.c | 66 | ||||
-rw-r--r-- | mysys/my_os2dirsrch.h | 20 | ||||
-rw-r--r-- | mysys/my_os2dlfcn.c | 4 | ||||
-rw-r--r-- | mysys/my_os2file64.c | 144 | ||||
-rw-r--r-- | mysys/my_os2mutex.c | 8 | ||||
-rw-r--r-- | mysys/my_os2thread.c | 6 | ||||
-rw-r--r-- | mysys/my_os2tls.c | 44 | ||||
-rw-r--r-- | mysys/my_port.c | 40 | ||||
-rw-r--r-- | mysys/mysys_priv.h | 6 | ||||
-rw-r--r-- | mysys/thr_rwlock.c | 1 | ||||
-rw-r--r-- | sql/ha_innobase.cc | 42 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 7 | ||||
-rw-r--r-- | sql/mysqld.cc | 26 |
26 files changed, 240 insertions, 239 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi index 321a5f0770e..6e86d85ee38 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -46928,9 +46928,10 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.52 @itemize @bullet @item -Changed behaviour that @code{IF(condition,column,NULL)} returns column type +Fixed problem with @code{UNSIGNED BIGINT} on AIX. @item -Fixed a security bug with empty db column in db table +Fixed security bug when having an empty databasename in the @code{user.db} +table. @item Changed initialisation of @code{RND()} to make it less predicatable. @item diff --git a/include/global.h b/include/global.h index 61e00df375d..a6cc561fb0a 100644 --- a/include/global.h +++ b/include/global.h @@ -104,6 +104,8 @@ #define _H_STRINGS #define _SYS_STREAM_H #define _AIX32_CURSES +#define longlong2double(A) my_longlong2double(A) +double my_longlong2double(unsigned long long A); #endif #ifdef HAVE_BROKEN_SNPRINTF /* HPUX 10.20 don't have this defined */ diff --git a/include/my_no_pthread.h b/include/my_no_pthread.h index 2ff8896fa74..328086ec388 100644 --- a/include/my_no_pthread.h +++ b/include/my_no_pthread.h @@ -21,7 +21,7 @@ environment, easier to use. */ -#if !defined(_my_no_pthread_h) && !defined(THREADS) +#if !defined(_my_no_pthread_h) && !defined(THREAD) #define _my_no_pthread_h #define pthread_mutex_init(A,B) diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared index d1271173b24..8fe15cca20c 100644 --- a/libmysql/Makefile.shared +++ b/libmysql/Makefile.shared @@ -57,7 +57,7 @@ mysysobjects1 = my_init.lo my_static.lo my_malloc.lo my_realloc.lo \ thr_mutex.lo mulalloc.lo string.lo default.lo \ my_compress.lo array.lo my_once.lo list.lo my_net.lo \ charset.lo hash.lo mf_iocache.lo my_seek.lo \ - my_pread.lo mf_cache.lo my_gethostbyname.lo + my_pread.lo mf_cache.lo my_gethostbyname.lo my_port.lo # Not needed in the minimum library mysysobjects2 = getopt.lo getopt1.lo getvar.lo my_lib.lo mysysobjects = $(mysysobjects1) $(mysysobjects2) diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 566702a7330..514ef9e704a 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -18,7 +18,7 @@ TZ=GMT-3; export TZ # for UNIX_TIMESTAMP tests to work # Program Definitions #-- -PATH=/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin +PATH=/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin:/usr/bin/X11 # Standard functions diff --git a/mysql-test/r/bigint.result b/mysql-test/r/bigint.result index 169ab041ed9..46ce0fda2c1 100644 --- a/mysql-test/r/bigint.result +++ b/mysql-test/r/bigint.result @@ -10,4 +10,6 @@ a a 18446744073709551615 a +18446744073709551615 +a 18446744073709551614 diff --git a/mysql-test/r/func_if.result b/mysql-test/r/func_if.result index f93f8028496..8b5d51a4ba2 100644 --- a/mysql-test/r/func_if.result +++ b/mysql-test/r/func_if.result @@ -34,4 +34,4 @@ aaa sum(if(num is null,0.00,num)) 144.54 min(if(y -x > 5,y,NULL)) max(if(y - x > 5,y,NULL)) -6 56 +16 6 diff --git a/mysql-test/t/bigint.test b/mysql-test/t/bigint.test index cd2fadc7f29..f7437d77c36 100644 --- a/mysql-test/t/bigint.test +++ b/mysql-test/t/bigint.test @@ -5,12 +5,18 @@ select 0,256,00000000000000065536,2147483647,-2147483648,2147483648,+4294967296; select 9223372036854775807,-009223372036854775808; select +9999999999999999999,-9999999999999999999; +# +# In 3.23 we have to disable the test of column to bigint as +# this fails on AIX powerpc (the resolution for double is not good enough) +# This will work on 4.0 as we then have internal handling of bigint variables. +# + drop table if exists t1; create table t1 (a bigint unsigned not null, primary key(a)); insert into t1 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE); select * from t1; select * from t1 where a=18446744073709551615; -#select * from t1 where a='18446744073709551615'; +select * from t1 where a='18446744073709551615'; delete from t1 where a=18446744073709551615; select * from t1; drop table t1; diff --git a/mysys/Makefile.am b/mysys/Makefile.am index 7de59939227..e3918f71b58 100644 --- a/mysys/Makefile.am +++ b/mysys/Makefile.am @@ -49,7 +49,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c\ my_quick.c my_lockmem.c my_static.c \ getopt.c getopt1.c getvar.c my_mkdir.c \ default.c my_compress.c checksum.c raid.cc raid2.c \ - my_net.c \ + my_net.c my_port.c \ my_vsnprintf.c charset.c my_bitmap.c my_gethostbyname.c EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \ thr_mutex.c thr_rwlock.c diff --git a/mysys/my_gethostbyname.c b/mysys/my_gethostbyname.c index f30591d9fe3..ffbfc424d0a 100644 --- a/mysys/my_gethostbyname.c +++ b/mysys/my_gethostbyname.c @@ -18,7 +18,6 @@ /* Thread safe version of gethostbyname_r() */ #include "mysys_priv.h" -#include "my_pthread.h" #include <assert.h> #if !defined(MSDOS) && !defined(__WIN__) #include <netdb.h> @@ -28,11 +27,6 @@ /* This file is not needed if my_gethostbyname_r is a macro */ #if !defined(my_gethostbyname_r) -#ifndef THREAD -#define pthread_mutex_lock(A) -#define pthread_mutex_unlock(A) -#endif - /* Emulate SOLARIS style calls, not because it's better, but just to make the usage of getbostbyname_r simpler. diff --git a/mysys/my_init.c b/mysys/my_init.c index 3bc87fd179d..31e49731c94 100644 --- a/mysys/my_init.c +++ b/mysys/my_init.c @@ -21,9 +21,6 @@ #include "m_ctype.h" #include <m_string.h> #include <m_ctype.h> -#ifdef THREAD -#include <my_pthread.h> -#endif #ifdef HAVE_GETRUSAGE #include <sys/resource.h> /* extern int getrusage(int, struct rusage *); */ diff --git a/mysys/my_net.c b/mysys/my_net.c index 1c91f7ff802..575c843f297 100644 --- a/mysys/my_net.c +++ b/mysys/my_net.c @@ -34,11 +34,6 @@ #endif #endif /* !defined(MSDOS) && !defined(__WIN__) */ -#ifndef THREAD -#define pthread_mutex_lock(A) -#define pthread_mutex_unlock(A) -#endif - void my_inet_ntoa(struct in_addr in, char *buf) { char *ptr; diff --git a/mysys/my_os2cond.c b/mysys/my_os2cond.c index c436ad9a0e9..d930aadb2d1 100644 --- a/mysys/my_os2cond.c +++ b/mysys/my_os2cond.c @@ -32,8 +32,8 @@ int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) { - APIRET rc = 0; - HEV event; + APIRET rc = 0; + HEV event; cond->waiting=0; /* Warp3 FP29 or Warp4 FP4 or better required */ rc = DosCreateEventSem( NULL, &cond->semaphore, 0x0800, 0); @@ -61,7 +61,7 @@ int pthread_cond_destroy(pthread_cond_t *cond) int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) { APIRET rc; - int rval; + int rval; rval = 0; cond->waiting++; @@ -80,13 +80,13 @@ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) } int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, - struct timespec *abstime) + struct timespec *abstime) { struct timeb curtime; int result; long timeout; APIRET rc; - int rval; + int rval; _ftime(&curtime); timeout= ((long) (abstime->ts_sec - curtime.time)*1000L + @@ -123,13 +123,13 @@ int pthread_cond_signal(pthread_cond_t *cond) int pthread_cond_broadcast(pthread_cond_t *cond) { - int i; + int i; APIRET rc; - /* - * Enter a loop to bring all threads off the - * condition queue: - */ + /* + * Enter a loop to bring all threads off the + * condition queue: + */ i = cond->waiting; while (i--) rc = DosPostEventSem(cond->semaphore); @@ -176,9 +176,9 @@ struct tm *localtime_r(const time_t *timep,struct tm *tmp) else { struct tm *res=localtime(timep); - if (!res) /* Wrong date */ + if (!res) /* Wrong date */ { - bzero(tmp,sizeof(*tmp)); /* Keep things safe */ + bzero(tmp,sizeof(*tmp)); /* Keep things safe */ return 0; } *tmp= *res; diff --git a/mysys/my_os2dirsrch.c b/mysys/my_os2dirsrch.c index 36f56d3ed2e..773d6800d1e 100644 --- a/mysys/my_os2dirsrch.c +++ b/mysys/my_os2dirsrch.c @@ -26,10 +26,10 @@ long _findfirst( char* path, struct _finddata_t* dos_file) { - HDIR hdir = HDIR_CREATE; - APIRET rc; + HDIR hdir = HDIR_CREATE; + APIRET rc; FILEFINDBUF3 buf3; - ULONG entries = 1; + ULONG entries = 1; #ifdef _DEBUG printf( "_findfirst path %s\n", path); @@ -37,13 +37,13 @@ long _findfirst( char* path, struct _finddata_t* dos_file) memset( &buf3, 0, sizeof( buf3)); rc = DosFindFirst( - path, /* Address of the ASCIIZ path name of the file or subdirectory to be found. */ - &hdir, /* Address of the handle associated with this DosFindFirst request. */ - FILE_NORMAL | FILE_DIRECTORY, /* Attribute value that determines the file objects to be searched for. */ - &buf3, /* Result buffer. */ - sizeof( buf3), /* The length, in bytes, of pfindbuf. */ - &entries, /* Pointer to the number of entries: */ - FIL_STANDARD); /* The level of file information required. */ + path, /* Address of the ASCIIZ path name of the file or subdirectory to be found. */ + &hdir, /* Address of the handle associated with this DosFindFirst request. */ + FILE_NORMAL | FILE_DIRECTORY, /* Attribute value that determines the file objects to be searched for. */ + &buf3, /* Result buffer. */ + sizeof( buf3), /* The length, in bytes, of pfindbuf. */ + &entries, /* Pointer to the number of entries: */ + FIL_STANDARD); /* The level of file information required. */ #ifdef _DEBUG printf( "_findfirst rc=%d hdir=%d entries=%d->%s\n", rc, hdir, entries, buf3.achName); @@ -64,16 +64,16 @@ long _findfirst( char* path, struct _finddata_t* dos_file) long _findnext( long hdir, struct _finddata_t* dos_file) { - APIRET rc; + APIRET rc; FILEFINDBUF3 buf3; - ULONG entries = 1; + ULONG entries = 1; memset( &buf3, 0, sizeof( buf3)); rc = DosFindNext( - hdir, - &buf3, /* Result buffer. */ - sizeof( buf3), /* The length, in bytes, of pfindbuf. */ - &entries); /* Pointer to the number of entries: */ + hdir, + &buf3, /* Result buffer. */ + sizeof( buf3), /* The length, in bytes, of pfindbuf. */ + &entries); /* Pointer to the number of entries: */ #ifdef _DEBUG printf( "_findnext rc=%d hdir=%d entries=%d->%s\n", rc, hdir, entries, buf3.achName); @@ -93,7 +93,7 @@ long _findnext( long hdir, struct _finddata_t* dos_file) void _findclose( long hdir) { - APIRET rc; + APIRET rc; rc = DosFindClose( hdir); #ifdef _DEBUG @@ -105,8 +105,8 @@ DIR* opendir( char* path) { DIR* dir = (DIR*) calloc( 1, sizeof( DIR)); char buffer[260]; - APIRET rc; - ULONG entries = 1; + APIRET rc; + ULONG entries = 1; strcpy( buffer, path); strcat( buffer, "*.*"); @@ -118,13 +118,13 @@ DIR* opendir( char* path) dir->hdir = HDIR_CREATE; memset( &dir->buf3, 0, sizeof( dir->buf3)); rc = DosFindFirst( - buffer, /* Address of the ASCIIZ path name of the file or subdirectory to be found. */ - &dir->hdir, /* Address of the handle associated with this DosFindFirst request. */ - FILE_NORMAL | FILE_DIRECTORY, /* Attribute value that determines the file objects to be searched for. */ - &dir->buf3, /* Result buffer. */ - sizeof( dir->buf3), /* The length, in bytes, of pfindbuf. */ - &entries, /* Pointer to the number of entries: */ - FIL_STANDARD); /* The level of file information required. */ + buffer, /* Address of the ASCIIZ path name of the file or subdirectory to be found. */ + &dir->hdir, /* Address of the handle associated with this DosFindFirst request. */ + FILE_NORMAL | FILE_DIRECTORY, /* Attribute value that determines the file objects to be searched for. */ + &dir->buf3, /* Result buffer. */ + sizeof( dir->buf3), /* The length, in bytes, of pfindbuf. */ + &entries, /* Pointer to the number of entries: */ + FIL_STANDARD); /* The level of file information required. */ #ifdef _DEBUG printf( "opendir rc=%d hdir=%d entries=%d->%s\n", rc, dir->hdir, entries, dir->buf3.achName); @@ -138,9 +138,9 @@ DIR* opendir( char* path) struct dirent* readdir( DIR* dir) { - APIRET rc; + APIRET rc; //FILEFINDBUF3 buf3; - ULONG entries = 1; + ULONG entries = 1; if (!dir->buf3.achName[0]) // file not found on previous query return NULL; @@ -151,10 +151,10 @@ struct dirent* readdir( DIR* dir) // query next file memset( &dir->buf3, 0, sizeof( dir->buf3)); rc = DosFindNext( - dir->hdir, - &dir->buf3, /* Result buffer. */ - sizeof( dir->buf3), /* The length, in bytes, of pfindbuf. */ - &entries); /* Pointer to the number of entries: */ + dir->hdir, + &dir->buf3, /* Result buffer. */ + sizeof( dir->buf3), /* The length, in bytes, of pfindbuf. */ + &entries); /* Pointer to the number of entries: */ #ifdef _DEBUG printf( "_findnext rc=%d hdir=%d entries=%d->%s\n", rc, dir->hdir, entries, dir->buf3.achName); @@ -168,7 +168,7 @@ struct dirent* readdir( DIR* dir) int closedir (DIR *dir) { - APIRET rc; + APIRET rc; rc = DosFindClose( dir->hdir); #ifdef _DEBUG diff --git a/mysys/my_os2dirsrch.h b/mysys/my_os2dirsrch.h index 2afe0f609f1..e894d27b576 100644 --- a/mysys/my_os2dirsrch.h +++ b/mysys/my_os2dirsrch.h @@ -30,9 +30,9 @@ extern "C" { struct _finddata_t { unsigned attrib; - //unsigned long time_create; /* -1 for FAT file systems */ - //unsigned long time_access; /* -1 for FAT file systems */ - //unsigned long time_write; + //unsigned long time_create; /* -1 for FAT file systems */ + //unsigned long time_access; /* -1 for FAT file systems */ + //unsigned long time_write; unsigned long size; char name[260]; //uint16 wr_date; @@ -42,10 +42,10 @@ struct _finddata_t struct dirent { //unsigned attrib; - //unsigned long time_create; /* -1 for FAT file systems */ - //unsigned long time_access; /* -1 for FAT file systems */ - //unsigned long time_write; - //unsigned long size; + //unsigned long time_create; /* -1 for FAT file systems */ + //unsigned long time_access; /* -1 for FAT file systems */ + //unsigned long time_write; + //unsigned long size; char d_name[260]; //uint16 wr_date; //uint16 wr_time; @@ -66,9 +66,9 @@ int closedir (DIR *); //#define _A_SUBDIR FILE_DIRECTORY //#define _A_RDONLY FILE_READONLY -//long _findfirst( char*, struct _finddata_t*); -//long _findnext( long, struct _finddata_t*); -//void _findclose( long); +//long _findfirst( char*, struct _finddata_t*); +//long _findnext( long, struct _finddata_t*); +//void _findclose( long); #ifdef __cplusplus_00 } diff --git a/mysys/my_os2dlfcn.c b/mysys/my_os2dlfcn.c index 0b0b5518eff..9c9a6061e8d 100644 --- a/mysys/my_os2dlfcn.c +++ b/mysys/my_os2dlfcn.c @@ -34,7 +34,7 @@ char* dlerror( void); void* dlsym( void* hmod, char* fn); void dlclose( void* hmod); -char fail[ 256]; +char fail[ 256]; void* dlopen( char* path, int flag) { @@ -56,7 +56,7 @@ char* dlerror( void) void* dlsym( void* hmod, char* fn) { APIRET rc; - PFN addr; + PFN addr; rc = DosQueryProcAddr( (HMODULE) hmod, 0l, fn, &addr); if (rc) diff --git a/mysys/my_os2file64.c b/mysys/my_os2file64.c index 2f41d344e32..bc24c92b87f 100644 --- a/mysys/my_os2file64.c +++ b/mysys/my_os2file64.c @@ -18,11 +18,11 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -void _OS2errno( APIRET rc); +void _OS2errno( APIRET rc); longlong _lseek64( int fd, longlong offset, int seektype); -int _lock64( int fd, int locktype, my_off_t start, - my_off_t length, myf MyFlags); -int _sopen64( const char *name, int oflag, int shflag, int mask); +int _lock64( int fd, int locktype, my_off_t start, + my_off_t length, myf MyFlags); +int _sopen64( const char *name, int oflag, int shflag, int mask); // // this class is used to define a global c++ variable, that @@ -34,52 +34,52 @@ class File64bit File64bit(); /* default constructor */ } initFile64bit; -static APIRET (* APIENTRY _DosOpenL)(PCSZ pszFileName, - PHFILE phf, - PULONG pulAction, - LONGLONG cbFile, - ULONG ulAttribute, - ULONG fsOpenFlags, - ULONG fsOpenMode, - PEAOP2 peaop2); -static APIRET (* APIENTRY _DosSetFilePtrL)(HFILE hFile, - LONGLONG ib, - ULONG method, - PLONGLONG ibActual); -static APIRET (* APIENTRY _DosSetFileLocksL)(HFILE hFile, - PFILELOCKL pflUnlock, - PFILELOCKL pflLock, - ULONG timeout, - ULONG flags); - -#define EIO EINVAL +static APIRET (* APIENTRY _DosOpenL)(PCSZ pszFileName, + PHFILE phf, + PULONG pulAction, + LONGLONG cbFile, + ULONG ulAttribute, + ULONG fsOpenFlags, + ULONG fsOpenMode, + PEAOP2 peaop2); +static APIRET (* APIENTRY _DosSetFilePtrL)(HFILE hFile, + LONGLONG ib, + ULONG method, + PLONGLONG ibActual); +static APIRET (* APIENTRY _DosSetFileLocksL)(HFILE hFile, + PFILELOCKL pflUnlock, + PFILELOCKL pflLock, + ULONG timeout, + ULONG flags); + +#define EIO EINVAL #define ESPIPE EBADSEEK static unsigned char const errno_tab[] = { - 0 , EINVAL, ENOENT, ENOENT, EMFILE, /* 0..4 */ - EACCES, EBADF, EIO, ENOMEM, EIO, /* 5..9 */ + 0 , EINVAL, ENOENT, ENOENT, EMFILE, /* 0..4 */ + EACCES, EBADF, EIO, ENOMEM, EIO, /* 5..9 */ EINVAL, ENOEXEC,EINVAL, EINVAL, EINVAL, /* 10..14 */ ENOENT, EBUSY, EXDEV, ENOENT, EROFS, /* 15..19 */ - EIO, EIO, EIO, EIO, EIO, /* 20..24 */ - EIO, EIO, EIO, ENOSPC, EIO, /* 25..29 */ - EIO, EIO, EACCES, EACCES, EIO, /* 30..34 */ - EIO, EIO, EIO, EIO, ENOSPC, /* 35..39 */ - EIO, EIO, EIO, EIO, EIO, /* 40..44 */ - EIO, EIO, EIO, EIO, EIO, /* 45..49 */ - EIO, EIO, EIO, EIO, EBUSY, /* 50..54 */ - EIO, EIO, EIO, EIO, EIO, /* 55..59 */ - EIO, ENOSPC, ENOSPC, EIO, EIO, /* 60..64 */ - EACCES, EIO, EIO, EIO, EIO, /* 65..69 */ - EIO, EIO, EIO, EROFS, EIO, /* 70..74 */ - EIO, EIO, EIO, EIO, EIO, /* 75..79 */ - EEXIST, EIO, ENOENT, EIO, EIO, /* 80..84 */ - EIO, EIO, EINVAL, EIO, EAGAIN, /* 85..89 */ - EIO, EIO, EIO, EIO, EIO, /* 90..94 */ - EINTR, EIO, EIO, EIO, EACCES, /* 95..99 */ + EIO, EIO, EIO, EIO, EIO, /* 20..24 */ + EIO, EIO, EIO, ENOSPC, EIO, /* 25..29 */ + EIO, EIO, EACCES, EACCES, EIO, /* 30..34 */ + EIO, EIO, EIO, EIO, ENOSPC, /* 35..39 */ + EIO, EIO, EIO, EIO, EIO, /* 40..44 */ + EIO, EIO, EIO, EIO, EIO, /* 45..49 */ + EIO, EIO, EIO, EIO, EBUSY, /* 50..54 */ + EIO, EIO, EIO, EIO, EIO, /* 55..59 */ + EIO, ENOSPC, ENOSPC, EIO, EIO, /* 60..64 */ + EACCES, EIO, EIO, EIO, EIO, /* 65..69 */ + EIO, EIO, EIO, EROFS, EIO, /* 70..74 */ + EIO, EIO, EIO, EIO, EIO, /* 75..79 */ + EEXIST, EIO, ENOENT, EIO, EIO, /* 80..84 */ + EIO, EIO, EINVAL, EIO, EAGAIN, /* 85..89 */ + EIO, EIO, EIO, EIO, EIO, /* 90..94 */ + EINTR, EIO, EIO, EIO, EACCES, /* 95..99 */ ENOMEM, EINVAL, EINVAL, ENOMEM, EINVAL, /* 100..104 */ - EINVAL, ENOMEM, EIO, EACCES, EPIPE, /* 105..109 */ + EINVAL, ENOMEM, EIO, EACCES, EPIPE, /* 105..109 */ ENOENT, E2BIG, ENOSPC, ENOMEM, EBADF, /* 110..114 */ EINVAL, EINVAL, EINVAL, EINVAL, EINVAL, /* 115..119 */ EINVAL, EINVAL, EINVAL, ENOENT, EINVAL, /* 120..124 */ @@ -121,16 +121,16 @@ static unsigned char const errno_tab[] = EINVAL, EBUSY, EINVAL, ESRCH, EINVAL, /* 300..304 */ ESRCH, EINVAL, EINVAL, EINVAL, ESRCH, /* 305..309 */ EINVAL, ENOMEM, EINVAL, EINVAL, EINVAL, /* 310..314 */ - EINVAL, E2BIG, ENOENT, EIO, EIO, /* 315..319 */ + EINVAL, E2BIG, ENOENT, EIO, EIO, /* 315..319 */ EINVAL, EINVAL, EINVAL, EINVAL, EAGAIN, /* 320..324 */ - EINVAL, EINVAL, EINVAL, EIO, ENOENT, /* 325..329 */ + EINVAL, EINVAL, EINVAL, EIO, ENOENT, /* 325..329 */ EACCES, EACCES, EACCES, ENOENT, ENOMEM /* 330..334 */ }; /* * Initialize 64bit file access: dynamic load of WSeB API */ - File64bit :: File64bit() + File64bit :: File64bit() { HMODULE hDoscalls; @@ -156,7 +156,7 @@ static unsigned char const errno_tab[] = #endif } -void _OS2errno( APIRET rc) +void _OS2errno( APIRET rc) { if (rc >= sizeof (errno_tab)) errno = EINVAL; @@ -187,19 +187,19 @@ longlong _lseek64( int fd, longlong offset, int seektype) } inline _SetFileLocksL(HFILE hFile, - PFILELOCKL pflUnlock, - PFILELOCKL pflLock, - ULONG timeout, - ULONG flags) + PFILELOCKL pflUnlock, + PFILELOCKL pflLock, + ULONG timeout, + ULONG flags) { if (_DosSetFileLocksL) { APIRET rc; rc = _DosSetFileLocksL( hFile, pflUnlock, pflLock, timeout, flags); - // on FAT/HPFS/LAN a INVALID_PARAMETER is returned, seems that + // on FAT/HPFS/LAN a INVALID_PARAMETER is returned, seems that // only JFS can handle >2GB ranges. if (rc != 87) - return rc; + return rc; // got INVALID_PARAMETER, fallback to standard call } @@ -209,8 +209,8 @@ inline _SetFileLocksL(HFILE hFile, return DosSetFileLocks( hFile, &flUnlock, &flLock, timeout, flags); } -int _lock64( int fd, int locktype, my_off_t start, - my_off_t length, myf MyFlags) +int _lock64( int fd, int locktype, my_off_t start, + my_off_t length, myf MyFlags) { FILELOCKL LockArea = {0,0}, UnlockArea = {0,0}; ULONG readonly = 0; @@ -241,16 +241,16 @@ int _lock64( int fd, int locktype, my_off_t start, //printf( "fd %d, locktype %d, rc %d (dont_wait)\n", fd, locktype, rc); if (rc == 33) { /* Lock Violation */ - DBUG_PRINT("info",("Was locked, trying with timeout")); - rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 1 * 1000, readonly); - //printf( "fd %d, locktype %d, rc %d (dont_wait with timeout)\n", fd, locktype, rc); + DBUG_PRINT("info",("Was locked, trying with timeout")); + rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 1 * 1000, readonly); + //printf( "fd %d, locktype %d, rc %d (dont_wait with timeout)\n", fd, locktype, rc); } } else { while( rc = _SetFileLocksL( fd, &UnlockArea, &LockArea, 0, readonly) && (rc == 33)) { - printf("."); - DosSleep(1 * 1000); + printf("."); + DosSleep(1 * 1000); } //printf( "fd %d, locktype %d, rc %d (wait2)\n", fd, locktype, rc); } @@ -264,9 +264,9 @@ int _lock64( int fd, int locktype, my_off_t start, return(-1); } -int sopen( const char *name, int oflag, int shflag, int mask) +int sopen( const char *name, int oflag, int shflag, int mask) { - int fail_errno; + int fail_errno; APIRET rc = 0; HFILE hf = 0; ULONG ulAction = 0; @@ -289,18 +289,18 @@ int sopen( const char *name, int oflag, int shflag, int mask) { if (oflag & O_EXCL) { - fsOpenFlags = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; - fail_errno = EEXIST; + fsOpenFlags = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; + fail_errno = EEXIST; } else if (oflag & O_TRUNC) - fsOpenFlags = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; + fsOpenFlags = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; else - fsOpenFlags = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; + fsOpenFlags = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; if (mask & S_IWRITE) - ulAttribute = FILE_NORMAL; + ulAttribute = FILE_NORMAL; else - ulAttribute = FILE_READONLY; + ulAttribute = FILE_READONLY; } else if (oflag & O_TRUNC) @@ -311,10 +311,10 @@ int sopen( const char *name, int oflag, int shflag, int mask) /* Try to open the file and handle errors. */ if (_DosOpenL) rc = _DosOpenL( name, &hf, &ulAction, cbFile, - ulAttribute, fsOpenFlags, fsOpenMode, NULL); + ulAttribute, fsOpenFlags, fsOpenMode, NULL); else rc = DosOpen( name, &hf, &ulAction, (LONG) cbFile, - ulAttribute, fsOpenFlags, fsOpenMode, NULL); + ulAttribute, fsOpenFlags, fsOpenMode, NULL); if (rc == ERROR_OPEN_FAILED) { @@ -334,7 +334,7 @@ int sopen( const char *name, int oflag, int shflag, int mask) return hf; } -int read( int fd, void *buffer, unsigned int count) +int read( int fd, void *buffer, unsigned int count) { APIRET rc; ULONG actual; @@ -350,7 +350,7 @@ int read( int fd, void *buffer, unsigned int count) return(-1); } -int write( int fd, const void *buffer, unsigned int count) +int write( int fd, const void *buffer, unsigned int count) { APIRET rc; ULONG actual; @@ -366,7 +366,7 @@ int write( int fd, const void *buffer, unsigned int count) return(-1); } -int close( int fd) +int close( int fd) { APIRET rc; ULONG actual; diff --git a/mysys/my_os2mutex.c b/mysys/my_os2mutex.c index 0ae6ae86d8c..718aa9f2932 100644 --- a/mysys/my_os2mutex.c +++ b/mysys/my_os2mutex.c @@ -72,8 +72,8 @@ pthread_mutex_destroy(pthread_mutex_t * mutex) int pthread_mutex_lock(pthread_mutex_t * mutex) { - int ret = 0; - int status = 0; + int ret = 0; + int status = 0; APIRET rc = 0; rc = DosRequestMutexSem(*mutex,SEM_INDEFINITE_WAIT); @@ -86,9 +86,9 @@ pthread_mutex_lock(pthread_mutex_t * mutex) int pthread_mutex_unlock(pthread_mutex_t * mutex) { - int ret = 0; + int ret = 0; APIRET rc = 0; - int status; + int status; rc = DosReleaseMutexSem(*mutex); diff --git a/mysys/my_os2thread.c b/mysys/my_os2thread.c index 89a3311c10b..6f196f43d75 100644 --- a/mysys/my_os2thread.c +++ b/mysys/my_os2thread.c @@ -31,9 +31,9 @@ static pthread_mutex_t THR_LOCK_thread; struct pthread_map { - HANDLE pthreadself; + HANDLE pthreadself; pthread_handler func; - void * param; + void * param; }; void win_pthread_init(void) @@ -57,7 +57,7 @@ static pthread_handler_decl(pthread_start,param) pthread_handler func=((struct pthread_map *) param)->func; void *func_param=((struct pthread_map *) param)->param; my_thread_init(); /* Will always succeed in windows */ - pthread_mutex_lock(&THR_LOCK_thread); /* Wait for beginthread to return */ + pthread_mutex_lock(&THR_LOCK_thread); /* Wait for beginthread to return */ win_pthread_self=((struct pthread_map *) param)->pthreadself; pthread_mutex_unlock(&THR_LOCK_thread); free((char*) param); /* Free param from create */ diff --git a/mysys/my_os2tls.c b/mysys/my_os2tls.c index 25d543d0768..1598fa34e2b 100644 --- a/mysys/my_os2tls.c +++ b/mysys/my_os2tls.c @@ -18,23 +18,23 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -DWORD TlsAlloc( void); -BOOL TlsFree( DWORD); -PVOID TlsGetValue( DWORD); -BOOL TlsSetValue( DWORD, PVOID); +DWORD TlsAlloc( void); +BOOL TlsFree( DWORD); +PVOID TlsGetValue( DWORD); +BOOL TlsSetValue( DWORD, PVOID); -#define TLS_MINIMUM_AVAILABLE 64 +#define TLS_MINIMUM_AVAILABLE 64 -PULONG tls_storage; /* TLS local storage */ -DWORD tls_bits[2]; /* TLS in-use bits */ -pthread_mutex_t tls_mutex; /* TLS mutex for in-use bits */ +PULONG tls_storage; /* TLS local storage */ +DWORD tls_bits[2]; /* TLS in-use bits */ +pthread_mutex_t tls_mutex; /* TLS mutex for in-use bits */ -DWORD TlsAlloc( void) +DWORD TlsAlloc( void) { DWORD index = -1; DWORD mask, tibidx; - int i; + int i; if (tls_storage == NULL) { @@ -43,12 +43,12 @@ DWORD TlsAlloc( void) // allocate memory for TLS storage rc = DosAllocThreadLocalMemory( 1, &tls_storage); if (rc) { - fprintf( stderr, "DosAllocThreadLocalMemory error: return code = %u\n", rc); + fprintf( stderr, "DosAllocThreadLocalMemory error: return code = %u\n", rc); } // create a mutex if (pthread_mutex_init( &tls_mutex, NULL)) - fprintf( stderr, "Failed to init TLS mutex\n"); + fprintf( stderr, "Failed to init TLS mutex\n"); } pthread_mutex_lock( &tls_mutex); @@ -56,18 +56,18 @@ DWORD TlsAlloc( void) tibidx = 0; if (tls_bits[0] == 0xFFFFFFFF) { if (tls_bits[1] == 0xFFFFFFFF) { - fprintf( stderr, "tid#%d, no more TLS bits available\n", _threadid); - pthread_mutex_unlock( &tls_mutex); - return -1; + fprintf( stderr, "tid#%d, no more TLS bits available\n", _threadid); + pthread_mutex_unlock( &tls_mutex); + return -1; } tibidx = 1; } for( i=0; i<32; i++) { mask = (1 << i); if ((tls_bits[ tibidx] & mask) == 0) { - tls_bits[ tibidx] |= mask; - index = (tibidx*32) + i; - break; + tls_bits[ tibidx] |= mask; + index = (tibidx*32) + i; + break; } } tls_storage[index] = 0; @@ -79,9 +79,9 @@ DWORD TlsAlloc( void) return index; } -BOOL TlsFree( DWORD index) +BOOL TlsFree( DWORD index) { - int tlsidx; + int tlsidx; DWORD mask; if (index >= TLS_MINIMUM_AVAILABLE) @@ -106,7 +106,7 @@ BOOL TlsFree( DWORD index) } -PVOID TlsGetValue( DWORD index) +PVOID TlsGetValue( DWORD index) { if (index >= TLS_MINIMUM_AVAILABLE) return NULL; @@ -122,7 +122,7 @@ PVOID TlsGetValue( DWORD index) return (PVOID) tls_array[ index]; } -BOOL TlsSetValue( DWORD index, PVOID val) +BOOL TlsSetValue( DWORD index, PVOID val) { // verify if memory has been allocated for this thread diff --git a/mysys/my_port.c b/mysys/my_port.c new file mode 100644 index 00000000000..a9778875850 --- /dev/null +++ b/mysys/my_port.c @@ -0,0 +1,40 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + Small functions to make code portable +*/ + +#include "mysys_priv.h" + +#ifdef _AIX + +/* + On AIX, at least with gcc 3.1, the expression + '(double) (ulonglong) var' doesn't always work for big unsigned + integers like '18446744073709551615'. The end result is that the + high bit is simply dropped. (probably bug in gcc optimizations) + Handling the conversion in a sub function seems to work. +*/ + + + +double my_longlong2double(unsigned long long nr) +{ + return (double) nr; +} +#endif /* _AIX */ diff --git a/mysys/mysys_priv.h b/mysys/mysys_priv.h index 20fda270658..2049347cb36 100644 --- a/mysys/mysys_priv.h +++ b/mysys/mysys_priv.h @@ -23,10 +23,10 @@ #endif #ifdef THREAD +#include <my_pthread.h> extern pthread_mutex_t THR_LOCK_malloc,THR_LOCK_open,THR_LOCK_keycache, THR_LOCK_lock,THR_LOCK_isam,THR_LOCK_net,THR_LOCK_charset; extern pthread_mutex_t LOCK_bitmap; -#else /* THREAD */ -#define pthread_mutex_lock(A) -#define pthread_mutex_unlock(A) +#else +#include <my_no_pthread.h> #endif diff --git a/mysys/thr_rwlock.c b/mysys/thr_rwlock.c index 866948a1c23..d4fe79a06ac 100644 --- a/mysys/thr_rwlock.c +++ b/mysys/thr_rwlock.c @@ -18,7 +18,6 @@ /* Synchronization - readers / writer thread locks */ #include "mysys_priv.h" -#include <my_pthread.h> #if defined(THREAD) && !defined(HAVE_PTHREAD_RWLOCK_RDLOCK) && !defined(HAVE_RWLOCK_INIT) /* diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc index 5e6d4b5f50c..2bea014519c 100644 --- a/sql/ha_innobase.cc +++ b/sql/ha_innobase.cc @@ -267,43 +267,6 @@ innobase_mysql_print_thd( thd = (THD*) input_thd; - buf += sprintf(buf, "MySQL thread id %lu, query id %lu", - thd->thread_id, thd->query_id); - if (thd->host) { - buf += sprintf(buf, " %.30s", thd->host); - } - - if (thd->ip) { - buf += sprintf(buf, " %.20s", thd->ip); - } - - if (thd->user) { - buf += sprintf(buf, " %.20s", thd->user); - } - - if (thd->proc_info) { - buf += sprintf(buf, " %.50s", thd->proc_info); - } - - if (thd->query) { - buf += sprintf(buf, "\n%.150s", thd->query); - } - - buf += sprintf(buf, "\n"); - -#ifdef notdefined - /* August 8, 2002 - Revert these changes because they make control characters sometimes - appear in the output and scramble it: - the reason is that the last character of the ouptput will be - '\n', not the null character '\0'. We do not know where the output - ends in buf! - - On platforms (what are those?) where sprintf does not work - we should define sprintf as 'my_emulated_sprintf'; InnoDB code - contains lots of sprintfs, it does not help to remove them from - just a single file. */ - /* We can't use value of sprintf() as this is not portable */ buf+= my_sprintf(buf, (buf, "MySQL thread id %lu", @@ -337,9 +300,8 @@ innobase_mysql_print_thd( *buf++='\n'; buf=strnmov(buf, thd->query, 150); } - *buf='\n'; - /* Here we should add '\0' to the end of output to mark its end */ -#endif + buf[0]='\n'; + buf[1]=0; } } diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 86e2ef29564..f17c8af3519 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -494,12 +494,7 @@ Item_func_if::fix_length_and_dec() decimals=max(args[1]->decimals,args[2]->decimals); enum Item_result arg1_type=args[1]->result_type(); enum Item_result arg2_type=args[2]->result_type(); - bool null1=args[1]->null_value; - bool null2=args[2]->null_value; - if (null1 && !null2) - arg1_type=arg2_type; - else if (!null1 && null2) - arg2_type=arg1_type; + binary=1; if (arg1_type == STRING_RESULT || arg2_type == STRING_RESULT) { diff --git a/sql/mysqld.cc b/sql/mysqld.cc index d73ec9fc0d6..150ad8ea379 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -43,6 +43,8 @@ #if defined(HAVE_DEC_3_2_THREADS) || defined(SIGNALS_DONT_BREAK_READ) #define HAVE_CLOSE_SERVER_SOCK 1 void close_server_sock(); +#else +#define close_server_sock() #endif extern "C" { // Because of SCO 3.2V4.2 @@ -465,9 +467,7 @@ static void close_connections(void) if (error != 0 && !count++) sql_print_error("Got error %d from pthread_cond_timedwait",error); #endif -#if defined(HAVE_DEC_3_2_THREADS) || defined(SIGNALS_DONT_BREAK_READ) close_server_sock(); -#endif } (void) pthread_mutex_unlock(&LOCK_thread_count); #endif /* __WIN__ */ @@ -598,18 +598,26 @@ if (hPipe != INVALID_HANDLE_VALUE && opt_enable_named_pipe) void close_server_sock() { DBUG_ENTER("close_server_sock"); + if (ip_sock != INVALID_SOCKET) { - DBUG_PRINT("info",("closing TCP/IP socket")); + DBUG_PRINT("info",("calling shutdown on TCP/IP socket")); VOID(shutdown(ip_sock,2)); +#ifdef NOT_USED + /* + The following code is disabled as it cases MySQL to hang on + AIX 4.3 during shutdown + */ + DBUG_PRINT("info",("calling closesocket on TCP/IP socket")); VOID(closesocket(ip_sock)); +#endif ip_sock=INVALID_SOCKET; } if (unix_sock != INVALID_SOCKET) { - DBUG_PRINT("info",("closing Unix socket")); + DBUG_PRINT("info",("calling shutdown on unix socket")); VOID(shutdown(unix_sock,2)); - VOID(closesocket(unix_sock)); + DBUG_PRINT("info",("calling closesocket on unix socket")); VOID(unlink(mysql_unix_port)); unix_sock=INVALID_SOCKET; } @@ -621,7 +629,8 @@ void kill_mysql(void) { DBUG_ENTER("kill_mysql"); #ifdef SIGNALS_DONT_BREAK_READ - close_server_sock(); /* force accept to wake up */ + abort_loop=1; // Break connection loops + close_server_sock(); // Force accept to wake up #endif #if defined(__WIN__) { @@ -647,10 +656,9 @@ void kill_mysql(void) DBUG_PRINT("quit",("After pthread_kill")); shutdown_in_progress=1; // Safety if kill didn't work #ifdef SIGNALS_DONT_BREAK_READ - if (!abort_loop) + if (!kill_in_progress) { pthread_t tmp; - abort_loop=1; if (pthread_create(&tmp,&connection_attrib, kill_server_thread, (void*) 0)) sql_print_error("Error: Can't create thread to kill server"); @@ -1220,7 +1228,7 @@ static void sig_reload(int signo) static void sig_kill(int signo) { - if (!abort_loop) + if (!kill_in_progress) { abort_loop=1; // mark abort for threads kill_server((void*) signo); |