Loading configure.in +19 −15 Original line number Diff line number Diff line Loading @@ -455,46 +455,50 @@ fi AC_SUBST(ABI_CHECK) # Lock for PS # Look for PS usage. We use double dollar-signs in FIND_PROC because this # value is written to a makefile, which interprets away one level of # dollar-signs. So, interpretation stages are m4 and then shell in autoconf, # then Make, then shell. The autoconf substitution uses single quotes, so # no unprotected single quotes should appear in the expression. AC_PATH_PROG(PS, ps, ps) AC_MSG_CHECKING("how to check if pid exists") PS=$ac_cv_path_PS # Linux style if $PS p $$ 2> /dev/null | grep `echo $0 | sed s/\-//` > /dev/null if $PS wwwp $$ 2> /dev/null | grep -- "$0" > /dev/null then FIND_PROC="$PS p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null" FIND_PROC="$PS wwwp \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null" # Solaris elif $PS -fp $$ 2> /dev/null | grep $0 > /dev/null elif $PS -fp $$ 2> /dev/null | grep -- $0 > /dev/null then FIND_PROC="$PS -p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null" FIND_PROC="$PS -p \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null" # BSD style elif $PS -uaxww 2> /dev/null | grep $0 > /dev/null elif $PS -uaxww 2> /dev/null | grep -- $0 > /dev/null then FIND_PROC="$PS -uaxww | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null" FIND_PROC="$PS -uaxww | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null" # SysV style elif $PS -ef 2> /dev/null | grep $0 > /dev/null elif $PS -ef 2> /dev/null | grep -- $0 > /dev/null then FIND_PROC="$PS -ef | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null" FIND_PROC="$PS -ef | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null" # Do anybody use this? elif $PS $$ 2> /dev/null | grep $0 > /dev/null elif $PS $$ 2> /dev/null | grep -- $0 > /dev/null then FIND_PROC="$PS \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null" FIND_PROC="$PS \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null" else case $SYSTEM_TYPE in *freebsd*|*dragonfly*) FIND_PROC="$PS p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null" FIND_PROC="$PS p \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null" ;; *darwin*) FIND_PROC="$PS -uaxww | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null" FIND_PROC="$PS -uaxww | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null" ;; *cygwin*) FIND_PROC="$PS -e | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null" FIND_PROC="$PS -e | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null" ;; *netware*) FIND_PROC= ;; *) AC_MSG_ERROR([Could not find the right ps switches. Which OS is this ?. See the Installation chapter in the Reference Manual.]) AC_MSG_ERROR([Could not find the right ps and/or grep switches. Which OS is this? See the Installation chapter in the Reference Manual.]) esac fi AC_SUBST(FIND_PROC) Loading include/hash.h +63 −25 Original line number Diff line number Diff line Loading @@ -21,6 +21,40 @@ extern "C" { #endif /* There was a problem on MacOSX with a shared object ha_example.so. It used hash_search(). During build of ha_example.so no libmysys was specified. Since MacOSX had a hash_search() in the system library, it built the shared object so that the dynamic linker linked hash_search() to the system library, which caused a crash when called. To come around this, we renamed hash_search() to my_hash_search(), as we did long ago with hash_insert() and hash_reset(). However, this time we made the move complete with all names. To keep compatibility, we redefine the old names. Since every C and C++ file, that uses HASH, needs to include this file, the change is complete. Both names could be used in the code, but the my_* versions are recommended now. */ #define hash_get_key my_hash_get_key #define hash_free_key my_hash_free_key #define hash_init my_hash_init #define hash_init2 my_hash_init2 #define _hash_init _my_hash_init #define hash_free my_hash_free #define hash_reset my_hash_reset #define hash_element my_hash_element #define hash_search my_hash_search #define hash_first my_hash_first #define hash_next my_hash_next #define hash_insert my_hash_insert #define hash_delete my_hash_delete #define hash_update my_hash_update #define hash_replace my_hash_replace #define hash_check my_hash_check #define hash_clear my_hash_clear #define hash_inited my_hash_inited #define hash_init_opt my_hash_init_opt /* Overhead to store an element in hash Can be used to approximate memory consumption for a hash Loading @@ -30,8 +64,8 @@ extern "C" { /* flags for hash_init */ #define HASH_UNIQUE 1 /* hash_insert fails on duplicate key */ typedef uchar *(*hash_get_key)(const uchar *,size_t*,my_bool); typedef void (*hash_free_key)(void *); typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool); typedef void (*my_hash_free_key)(void *); typedef struct st_hash { size_t key_offset,key_length; /* Length of key if const length */ Loading @@ -39,7 +73,7 @@ typedef struct st_hash { ulong records; uint flags; DYNAMIC_ARRAY array; /* Place for hash_keys */ hash_get_key get_key; my_hash_get_key get_key; void (*free)(void *); CHARSET_INFO *charset; } HASH; Loading @@ -47,30 +81,34 @@ typedef struct st_hash { /* A search iterator state */ typedef uint HASH_SEARCH_STATE; #define hash_init(A,B,C,D,E,F,G,H) _hash_init(A,0,B,C,D,E,F,G,H CALLER_INFO) #define hash_init2(A,B,C,D,E,F,G,H,I) _hash_init(A,B,C,D,E,F,G,H,I CALLER_INFO) my_bool _hash_init(HASH *hash, uint growth_size,CHARSET_INFO *charset, #define my_hash_init(A,B,C,D,E,F,G,H) \ _my_hash_init(A,0,B,C,D,E,F,G,H CALLER_INFO) #define my_hash_init2(A,B,C,D,E,F,G,H,I) \ _my_hash_init(A,B,C,D,E,F,G,H,I CALLER_INFO) my_bool _my_hash_init(HASH *hash, uint growth_size, CHARSET_INFO *charset, ulong default_array_elements, size_t key_offset, size_t key_length, hash_get_key get_key, void (*free_element)(void*), uint flags CALLER_INFO_PROTO); void hash_free(HASH *tree); size_t key_length, my_hash_get_key get_key, void (*free_element)(void*), uint flags CALLER_INFO_PROTO); void my_hash_free(HASH *tree); void my_hash_reset(HASH *hash); uchar *hash_element(HASH *hash,ulong idx); uchar *hash_search(const HASH *info, const uchar *key, size_t length); uchar *hash_first(const HASH *info, const uchar *key, size_t length, uchar *my_hash_element(HASH *hash, ulong idx); uchar *my_hash_search(const HASH *info, const uchar *key, size_t length); uchar *my_hash_first(const HASH *info, const uchar *key, size_t length, HASH_SEARCH_STATE *state); uchar *hash_next(const HASH *info, const uchar *key, size_t length, uchar *my_hash_next(const HASH *info, const uchar *key, size_t length, HASH_SEARCH_STATE *state); my_bool my_hash_insert(HASH *info, const uchar *data); my_bool hash_delete(HASH *hash,uchar *record); my_bool hash_update(HASH *hash,uchar *record,uchar *old_key,size_t old_key_length); void hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row); my_bool hash_check(HASH *hash); /* Only in debug library */ my_bool my_hash_delete(HASH *hash, uchar *record); my_bool my_hash_update(HASH *hash, uchar *record, uchar *old_key, size_t old_key_length); void my_hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row); my_bool my_hash_check(HASH *hash); /* Only in debug library */ #define hash_clear(H) bzero((char*) (H),sizeof(*(H))) #define hash_inited(H) ((H)->array.buffer != 0) #define hash_init_opt(A,B,C,D,E,F,G,H) \ (!hash_inited(A) && _hash_init(A,0,B,C,D,E,F,G, H CALLER_INFO)) #define my_hash_clear(H) bzero((char*) (H), sizeof(*(H))) #define my_hash_inited(H) ((H)->array.buffer != 0) #define my_hash_init_opt(A,B,C,D,E,F,G,H) \ (!my_hash_inited(A) && _my_hash_init(A,0,B,C,D,E,F,G, H CALLER_INFO)) #ifdef __cplusplus } Loading mysql-test/include/index_merge1.inc +15 −0 Original line number Diff line number Diff line Loading @@ -487,3 +487,18 @@ select * from t2 where a=4 or b=4; drop table t1, t2; # # Bug #37943: Reproducible mysqld crash/sigsegv in sel_trees_can_be_ored # CREATE TABLE t1 (a varchar(8), b set('a','b','c','d','e','f','g','h'), KEY b(b), KEY a(a)); INSERT INTO t1 VALUES ('y',''), ('z',''); #should not crash SELECT b,a from t1 WHERE (b!='c' AND b!='f' && b!='h') OR (a='pure-S') OR (a='DE80337a') OR (a='DE80799'); DROP TABLE t1; --echo End of 5.0 tests mysql-test/mysql-test-run.pl +10 −1 Original line number Diff line number Diff line Loading @@ -3601,8 +3601,17 @@ sub run_testcase ($) { { mtr_timer_stop_all($glob_timers); mtr_report("\nServers started, exiting"); if ($glob_win32_perl) { #ActiveState perl hangs when using normal exit, use POSIX::_exit instead use POSIX qw[ _exit ]; POSIX::_exit(0); } else { exit(0); } } { do_before_run_mysqltest($tinfo); Loading mysql-test/r/create.result +2 −0 Original line number Diff line number Diff line Loading @@ -1559,6 +1559,8 @@ SHOW INDEX FROM t1; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment t1 1 c1 1 c1 A NULL NULL NULL YES BTREE DROP TABLE t1; create user mysqltest_1@'test@test'; ERROR HY000: Malformed hostname (illegal symbol: '@') CREATE TABLE t1 (a INTEGER AUTO_INCREMENT PRIMARY KEY, b INTEGER NOT NULL); INSERT IGNORE INTO t1 (b) VALUES (5); CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY) Loading Loading
configure.in +19 −15 Original line number Diff line number Diff line Loading @@ -455,46 +455,50 @@ fi AC_SUBST(ABI_CHECK) # Lock for PS # Look for PS usage. We use double dollar-signs in FIND_PROC because this # value is written to a makefile, which interprets away one level of # dollar-signs. So, interpretation stages are m4 and then shell in autoconf, # then Make, then shell. The autoconf substitution uses single quotes, so # no unprotected single quotes should appear in the expression. AC_PATH_PROG(PS, ps, ps) AC_MSG_CHECKING("how to check if pid exists") PS=$ac_cv_path_PS # Linux style if $PS p $$ 2> /dev/null | grep `echo $0 | sed s/\-//` > /dev/null if $PS wwwp $$ 2> /dev/null | grep -- "$0" > /dev/null then FIND_PROC="$PS p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null" FIND_PROC="$PS wwwp \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null" # Solaris elif $PS -fp $$ 2> /dev/null | grep $0 > /dev/null elif $PS -fp $$ 2> /dev/null | grep -- $0 > /dev/null then FIND_PROC="$PS -p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null" FIND_PROC="$PS -p \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null" # BSD style elif $PS -uaxww 2> /dev/null | grep $0 > /dev/null elif $PS -uaxww 2> /dev/null | grep -- $0 > /dev/null then FIND_PROC="$PS -uaxww | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null" FIND_PROC="$PS -uaxww | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null" # SysV style elif $PS -ef 2> /dev/null | grep $0 > /dev/null elif $PS -ef 2> /dev/null | grep -- $0 > /dev/null then FIND_PROC="$PS -ef | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null" FIND_PROC="$PS -ef | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null" # Do anybody use this? elif $PS $$ 2> /dev/null | grep $0 > /dev/null elif $PS $$ 2> /dev/null | grep -- $0 > /dev/null then FIND_PROC="$PS \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null" FIND_PROC="$PS \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null" else case $SYSTEM_TYPE in *freebsd*|*dragonfly*) FIND_PROC="$PS p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null" FIND_PROC="$PS p \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null" ;; *darwin*) FIND_PROC="$PS -uaxww | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null" FIND_PROC="$PS -uaxww | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null" ;; *cygwin*) FIND_PROC="$PS -e | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null" FIND_PROC="$PS -e | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null" ;; *netware*) FIND_PROC= ;; *) AC_MSG_ERROR([Could not find the right ps switches. Which OS is this ?. See the Installation chapter in the Reference Manual.]) AC_MSG_ERROR([Could not find the right ps and/or grep switches. Which OS is this? See the Installation chapter in the Reference Manual.]) esac fi AC_SUBST(FIND_PROC) Loading
include/hash.h +63 −25 Original line number Diff line number Diff line Loading @@ -21,6 +21,40 @@ extern "C" { #endif /* There was a problem on MacOSX with a shared object ha_example.so. It used hash_search(). During build of ha_example.so no libmysys was specified. Since MacOSX had a hash_search() in the system library, it built the shared object so that the dynamic linker linked hash_search() to the system library, which caused a crash when called. To come around this, we renamed hash_search() to my_hash_search(), as we did long ago with hash_insert() and hash_reset(). However, this time we made the move complete with all names. To keep compatibility, we redefine the old names. Since every C and C++ file, that uses HASH, needs to include this file, the change is complete. Both names could be used in the code, but the my_* versions are recommended now. */ #define hash_get_key my_hash_get_key #define hash_free_key my_hash_free_key #define hash_init my_hash_init #define hash_init2 my_hash_init2 #define _hash_init _my_hash_init #define hash_free my_hash_free #define hash_reset my_hash_reset #define hash_element my_hash_element #define hash_search my_hash_search #define hash_first my_hash_first #define hash_next my_hash_next #define hash_insert my_hash_insert #define hash_delete my_hash_delete #define hash_update my_hash_update #define hash_replace my_hash_replace #define hash_check my_hash_check #define hash_clear my_hash_clear #define hash_inited my_hash_inited #define hash_init_opt my_hash_init_opt /* Overhead to store an element in hash Can be used to approximate memory consumption for a hash Loading @@ -30,8 +64,8 @@ extern "C" { /* flags for hash_init */ #define HASH_UNIQUE 1 /* hash_insert fails on duplicate key */ typedef uchar *(*hash_get_key)(const uchar *,size_t*,my_bool); typedef void (*hash_free_key)(void *); typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool); typedef void (*my_hash_free_key)(void *); typedef struct st_hash { size_t key_offset,key_length; /* Length of key if const length */ Loading @@ -39,7 +73,7 @@ typedef struct st_hash { ulong records; uint flags; DYNAMIC_ARRAY array; /* Place for hash_keys */ hash_get_key get_key; my_hash_get_key get_key; void (*free)(void *); CHARSET_INFO *charset; } HASH; Loading @@ -47,30 +81,34 @@ typedef struct st_hash { /* A search iterator state */ typedef uint HASH_SEARCH_STATE; #define hash_init(A,B,C,D,E,F,G,H) _hash_init(A,0,B,C,D,E,F,G,H CALLER_INFO) #define hash_init2(A,B,C,D,E,F,G,H,I) _hash_init(A,B,C,D,E,F,G,H,I CALLER_INFO) my_bool _hash_init(HASH *hash, uint growth_size,CHARSET_INFO *charset, #define my_hash_init(A,B,C,D,E,F,G,H) \ _my_hash_init(A,0,B,C,D,E,F,G,H CALLER_INFO) #define my_hash_init2(A,B,C,D,E,F,G,H,I) \ _my_hash_init(A,B,C,D,E,F,G,H,I CALLER_INFO) my_bool _my_hash_init(HASH *hash, uint growth_size, CHARSET_INFO *charset, ulong default_array_elements, size_t key_offset, size_t key_length, hash_get_key get_key, void (*free_element)(void*), uint flags CALLER_INFO_PROTO); void hash_free(HASH *tree); size_t key_length, my_hash_get_key get_key, void (*free_element)(void*), uint flags CALLER_INFO_PROTO); void my_hash_free(HASH *tree); void my_hash_reset(HASH *hash); uchar *hash_element(HASH *hash,ulong idx); uchar *hash_search(const HASH *info, const uchar *key, size_t length); uchar *hash_first(const HASH *info, const uchar *key, size_t length, uchar *my_hash_element(HASH *hash, ulong idx); uchar *my_hash_search(const HASH *info, const uchar *key, size_t length); uchar *my_hash_first(const HASH *info, const uchar *key, size_t length, HASH_SEARCH_STATE *state); uchar *hash_next(const HASH *info, const uchar *key, size_t length, uchar *my_hash_next(const HASH *info, const uchar *key, size_t length, HASH_SEARCH_STATE *state); my_bool my_hash_insert(HASH *info, const uchar *data); my_bool hash_delete(HASH *hash,uchar *record); my_bool hash_update(HASH *hash,uchar *record,uchar *old_key,size_t old_key_length); void hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row); my_bool hash_check(HASH *hash); /* Only in debug library */ my_bool my_hash_delete(HASH *hash, uchar *record); my_bool my_hash_update(HASH *hash, uchar *record, uchar *old_key, size_t old_key_length); void my_hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row); my_bool my_hash_check(HASH *hash); /* Only in debug library */ #define hash_clear(H) bzero((char*) (H),sizeof(*(H))) #define hash_inited(H) ((H)->array.buffer != 0) #define hash_init_opt(A,B,C,D,E,F,G,H) \ (!hash_inited(A) && _hash_init(A,0,B,C,D,E,F,G, H CALLER_INFO)) #define my_hash_clear(H) bzero((char*) (H), sizeof(*(H))) #define my_hash_inited(H) ((H)->array.buffer != 0) #define my_hash_init_opt(A,B,C,D,E,F,G,H) \ (!my_hash_inited(A) && _my_hash_init(A,0,B,C,D,E,F,G, H CALLER_INFO)) #ifdef __cplusplus } Loading
mysql-test/include/index_merge1.inc +15 −0 Original line number Diff line number Diff line Loading @@ -487,3 +487,18 @@ select * from t2 where a=4 or b=4; drop table t1, t2; # # Bug #37943: Reproducible mysqld crash/sigsegv in sel_trees_can_be_ored # CREATE TABLE t1 (a varchar(8), b set('a','b','c','d','e','f','g','h'), KEY b(b), KEY a(a)); INSERT INTO t1 VALUES ('y',''), ('z',''); #should not crash SELECT b,a from t1 WHERE (b!='c' AND b!='f' && b!='h') OR (a='pure-S') OR (a='DE80337a') OR (a='DE80799'); DROP TABLE t1; --echo End of 5.0 tests
mysql-test/mysql-test-run.pl +10 −1 Original line number Diff line number Diff line Loading @@ -3601,8 +3601,17 @@ sub run_testcase ($) { { mtr_timer_stop_all($glob_timers); mtr_report("\nServers started, exiting"); if ($glob_win32_perl) { #ActiveState perl hangs when using normal exit, use POSIX::_exit instead use POSIX qw[ _exit ]; POSIX::_exit(0); } else { exit(0); } } { do_before_run_mysqltest($tinfo); Loading
mysql-test/r/create.result +2 −0 Original line number Diff line number Diff line Loading @@ -1559,6 +1559,8 @@ SHOW INDEX FROM t1; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment t1 1 c1 1 c1 A NULL NULL NULL YES BTREE DROP TABLE t1; create user mysqltest_1@'test@test'; ERROR HY000: Malformed hostname (illegal symbol: '@') CREATE TABLE t1 (a INTEGER AUTO_INCREMENT PRIMARY KEY, b INTEGER NOT NULL); INSERT IGNORE INTO t1 (b) VALUES (5); CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY) Loading