mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
InnoDB bug fix (row0mysql.c): make reserved table names innodb_* special again
innobase/row/row0mysql.c: row_create_table_for_mysql(), row_drop_table_for_mysql(): Make InnoDB recognize the special table names innodb_* again.
This commit is contained in:
@ -1394,7 +1394,8 @@ row_create_table_for_mysql(
|
|||||||
tab_node_t* node;
|
tab_node_t* node;
|
||||||
mem_heap_t* heap;
|
mem_heap_t* heap;
|
||||||
que_thr_t* thr;
|
que_thr_t* thr;
|
||||||
ulint namelen;
|
const char* table_name;
|
||||||
|
ulint table_name_len;
|
||||||
ulint err;
|
ulint err;
|
||||||
|
|
||||||
ut_ad(trx->mysql_thread_id == os_thread_get_curr_id());
|
ut_ad(trx->mysql_thread_id == os_thread_get_curr_id());
|
||||||
@ -1446,10 +1447,17 @@ row_create_table_for_mysql(
|
|||||||
return(row_mysql_recover_tmp_table(table, trx));
|
return(row_mysql_recover_tmp_table(table, trx));
|
||||||
}
|
}
|
||||||
|
|
||||||
namelen = strlen(table->name) + 1;
|
/* The table name is prefixed with the database name and a '/'.
|
||||||
|
Certain table names starting with 'innodb_' have their special
|
||||||
|
meaning regardless of the database name. Thus, we need to
|
||||||
|
ignore the database name prefix in the comparisons. */
|
||||||
|
table_name = strchr(table->name, '/');
|
||||||
|
ut_a(table_name);
|
||||||
|
table_name++;
|
||||||
|
table_name_len = strlen(table_name) + 1;
|
||||||
|
|
||||||
if (namelen == sizeof S_innodb_monitor
|
if (table_name_len == sizeof S_innodb_monitor
|
||||||
&& !memcmp(table->name, S_innodb_monitor,
|
&& !memcmp(table_name, S_innodb_monitor,
|
||||||
sizeof S_innodb_monitor)) {
|
sizeof S_innodb_monitor)) {
|
||||||
|
|
||||||
/* Table equals "innodb_monitor":
|
/* Table equals "innodb_monitor":
|
||||||
@ -1461,27 +1469,27 @@ row_create_table_for_mysql(
|
|||||||
of InnoDB monitor prints */
|
of InnoDB monitor prints */
|
||||||
|
|
||||||
os_event_set(srv_lock_timeout_thread_event);
|
os_event_set(srv_lock_timeout_thread_event);
|
||||||
} else if (namelen == sizeof S_innodb_lock_monitor
|
} else if (table_name_len == sizeof S_innodb_lock_monitor
|
||||||
&& !memcmp(table->name, S_innodb_lock_monitor,
|
&& !memcmp(table_name, S_innodb_lock_monitor,
|
||||||
sizeof S_innodb_lock_monitor)) {
|
sizeof S_innodb_lock_monitor)) {
|
||||||
|
|
||||||
srv_print_innodb_monitor = TRUE;
|
srv_print_innodb_monitor = TRUE;
|
||||||
srv_print_innodb_lock_monitor = TRUE;
|
srv_print_innodb_lock_monitor = TRUE;
|
||||||
os_event_set(srv_lock_timeout_thread_event);
|
os_event_set(srv_lock_timeout_thread_event);
|
||||||
} else if (namelen == sizeof S_innodb_tablespace_monitor
|
} else if (table_name_len == sizeof S_innodb_tablespace_monitor
|
||||||
&& !memcmp(table->name, S_innodb_tablespace_monitor,
|
&& !memcmp(table_name, S_innodb_tablespace_monitor,
|
||||||
sizeof S_innodb_tablespace_monitor)) {
|
sizeof S_innodb_tablespace_monitor)) {
|
||||||
|
|
||||||
srv_print_innodb_tablespace_monitor = TRUE;
|
srv_print_innodb_tablespace_monitor = TRUE;
|
||||||
os_event_set(srv_lock_timeout_thread_event);
|
os_event_set(srv_lock_timeout_thread_event);
|
||||||
} else if (namelen == sizeof S_innodb_table_monitor
|
} else if (table_name_len == sizeof S_innodb_table_monitor
|
||||||
&& !memcmp(table->name, S_innodb_table_monitor,
|
&& !memcmp(table_name, S_innodb_table_monitor,
|
||||||
sizeof S_innodb_table_monitor)) {
|
sizeof S_innodb_table_monitor)) {
|
||||||
|
|
||||||
srv_print_innodb_table_monitor = TRUE;
|
srv_print_innodb_table_monitor = TRUE;
|
||||||
os_event_set(srv_lock_timeout_thread_event);
|
os_event_set(srv_lock_timeout_thread_event);
|
||||||
} else if (namelen == sizeof S_innodb_mem_validate
|
} else if (table_name_len == sizeof S_innodb_mem_validate
|
||||||
&& !memcmp(table->name, S_innodb_mem_validate,
|
&& !memcmp(table_name, S_innodb_mem_validate,
|
||||||
sizeof S_innodb_mem_validate)) {
|
sizeof S_innodb_mem_validate)) {
|
||||||
/* We define here a debugging feature intended for
|
/* We define here a debugging feature intended for
|
||||||
developers */
|
developers */
|
||||||
@ -1909,6 +1917,7 @@ row_drop_table_for_mysql(
|
|||||||
que_thr_t* thr;
|
que_thr_t* thr;
|
||||||
que_t* graph;
|
que_t* graph;
|
||||||
ulint err;
|
ulint err;
|
||||||
|
const char* table_name;
|
||||||
ulint namelen;
|
ulint namelen;
|
||||||
ibool locked_dictionary = FALSE;
|
ibool locked_dictionary = FALSE;
|
||||||
char* quoted_name;
|
char* quoted_name;
|
||||||
@ -1997,10 +2006,17 @@ row_drop_table_for_mysql(
|
|||||||
|
|
||||||
trx_start_if_not_started(trx);
|
trx_start_if_not_started(trx);
|
||||||
|
|
||||||
namelen = strlen(name) + 1;
|
/* The table name is prefixed with the database name and a '/'.
|
||||||
|
Certain table names starting with 'innodb_' have their special
|
||||||
|
meaning regardless of the database name. Thus, we need to
|
||||||
|
ignore the database name prefix in the comparisons. */
|
||||||
|
table_name = strchr(name, '/');
|
||||||
|
ut_a(table_name);
|
||||||
|
table_name++;
|
||||||
|
namelen = strlen(table_name) + 1;
|
||||||
|
|
||||||
if (namelen == sizeof S_innodb_monitor
|
if (namelen == sizeof S_innodb_monitor
|
||||||
&& !memcmp(name, S_innodb_monitor,
|
&& !memcmp(table_name, S_innodb_monitor,
|
||||||
sizeof S_innodb_monitor)) {
|
sizeof S_innodb_monitor)) {
|
||||||
|
|
||||||
/* Table name equals "innodb_monitor":
|
/* Table name equals "innodb_monitor":
|
||||||
@ -2009,18 +2025,18 @@ row_drop_table_for_mysql(
|
|||||||
srv_print_innodb_monitor = FALSE;
|
srv_print_innodb_monitor = FALSE;
|
||||||
srv_print_innodb_lock_monitor = FALSE;
|
srv_print_innodb_lock_monitor = FALSE;
|
||||||
} else if (namelen == sizeof S_innodb_lock_monitor
|
} else if (namelen == sizeof S_innodb_lock_monitor
|
||||||
&& !memcmp(name, S_innodb_lock_monitor,
|
&& !memcmp(table_name, S_innodb_lock_monitor,
|
||||||
sizeof S_innodb_lock_monitor)) {
|
sizeof S_innodb_lock_monitor)) {
|
||||||
|
|
||||||
srv_print_innodb_monitor = FALSE;
|
srv_print_innodb_monitor = FALSE;
|
||||||
srv_print_innodb_lock_monitor = FALSE;
|
srv_print_innodb_lock_monitor = FALSE;
|
||||||
} else if (namelen == sizeof S_innodb_tablespace_monitor
|
} else if (namelen == sizeof S_innodb_tablespace_monitor
|
||||||
&& !memcmp(name, S_innodb_tablespace_monitor,
|
&& !memcmp(table_name, S_innodb_tablespace_monitor,
|
||||||
sizeof S_innodb_tablespace_monitor)) {
|
sizeof S_innodb_tablespace_monitor)) {
|
||||||
|
|
||||||
srv_print_innodb_tablespace_monitor = FALSE;
|
srv_print_innodb_tablespace_monitor = FALSE;
|
||||||
} else if (namelen == sizeof S_innodb_table_monitor
|
} else if (namelen == sizeof S_innodb_table_monitor
|
||||||
&& !memcmp(name, S_innodb_table_monitor,
|
&& !memcmp(table_name, S_innodb_table_monitor,
|
||||||
sizeof S_innodb_table_monitor)) {
|
sizeof S_innodb_table_monitor)) {
|
||||||
|
|
||||||
srv_print_innodb_table_monitor = FALSE;
|
srv_print_innodb_table_monitor = FALSE;
|
||||||
|
Reference in New Issue
Block a user