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/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 mysql-test/r/information_schema_db.result +21 −0 Original line number Diff line number Diff line Loading @@ -221,3 +221,24 @@ drop view testdb_1.v1, v2, testdb_1.v3, v4; drop database testdb_1; drop user testdb_1@localhost; drop user testdb_2@localhost; create database testdb_1; create table testdb_1.t1 (a int); create view testdb_1.v1 as select * from testdb_1.t1; grant show view on testdb_1.* to mysqltest_1@localhost; grant select on testdb_1.v1 to mysqltest_1@localhost; select table_schema, table_name, view_definition from information_schema.views where table_name='v1'; table_schema table_name view_definition testdb_1 v1 select `testdb_1`.`t1`.`a` AS `a` from `testdb_1`.`t1` show create view testdb_1.v1; View Create View character_set_client collation_connection v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `testdb_1`.`v1` AS select `testdb_1`.`t1`.`a` AS `a` from `testdb_1`.`t1` latin1 latin1_swedish_ci revoke select on testdb_1.v1 from mysqltest_1@localhost; select table_schema, table_name, view_definition from information_schema.views where table_name='v1'; table_schema table_name view_definition testdb_1 v1 show create view testdb_1.v1; ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 'v1' drop user mysqltest_1@localhost; drop database testdb_1; mysql-test/t/create.test +5 −0 Original line number Diff line number Diff line Loading @@ -1175,6 +1175,11 @@ CREATE TABLE t1(c1 VARCHAR(33), KEY USING HASH (c1) USING BTREE) ENGINE=MEMORY; SHOW INDEX FROM t1; DROP TABLE t1; # # Bug#35924 DEFINER should be stored 'quoted' in I_S # --error ER_UNKNOWN_ERROR create user mysqltest_1@'test@test'; # # Bug#38821: Assert table->auto_increment_field_not_null failed in open_table() Loading 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/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
mysql-test/r/information_schema_db.result +21 −0 Original line number Diff line number Diff line Loading @@ -221,3 +221,24 @@ drop view testdb_1.v1, v2, testdb_1.v3, v4; drop database testdb_1; drop user testdb_1@localhost; drop user testdb_2@localhost; create database testdb_1; create table testdb_1.t1 (a int); create view testdb_1.v1 as select * from testdb_1.t1; grant show view on testdb_1.* to mysqltest_1@localhost; grant select on testdb_1.v1 to mysqltest_1@localhost; select table_schema, table_name, view_definition from information_schema.views where table_name='v1'; table_schema table_name view_definition testdb_1 v1 select `testdb_1`.`t1`.`a` AS `a` from `testdb_1`.`t1` show create view testdb_1.v1; View Create View character_set_client collation_connection v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `testdb_1`.`v1` AS select `testdb_1`.`t1`.`a` AS `a` from `testdb_1`.`t1` latin1 latin1_swedish_ci revoke select on testdb_1.v1 from mysqltest_1@localhost; select table_schema, table_name, view_definition from information_schema.views where table_name='v1'; table_schema table_name view_definition testdb_1 v1 show create view testdb_1.v1; ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 'v1' drop user mysqltest_1@localhost; drop database testdb_1;
mysql-test/t/create.test +5 −0 Original line number Diff line number Diff line Loading @@ -1175,6 +1175,11 @@ CREATE TABLE t1(c1 VARCHAR(33), KEY USING HASH (c1) USING BTREE) ENGINE=MEMORY; SHOW INDEX FROM t1; DROP TABLE t1; # # Bug#35924 DEFINER should be stored 'quoted' in I_S # --error ER_UNKNOWN_ERROR create user mysqltest_1@'test@test'; # # Bug#38821: Assert table->auto_increment_field_not_null failed in open_table() Loading