diff options
author | Michael Widenius <monty@askmonty.org> | 2010-11-04 16:53:10 +0200 |
---|---|---|
committer | Michael Widenius <monty@askmonty.org> | 2010-11-04 16:53:10 +0200 |
commit | 3797ca41b39c862cf4733eadea8c91ed138ca1a4 (patch) | |
tree | ec51a2bcd2a7c071f89d3177ca7914dccd111c9f /sql | |
parent | 5789f96c624d00aeef137602ab0c4828620748e8 (diff) | |
parent | 3bac9cf7fe12c1b1c644ac7963c701b79b3127f3 (diff) | |
download | mariadb-git-3797ca41b39c862cf4733eadea8c91ed138ca1a4.tar.gz |
Automatic merge with 5.1
Diffstat (limited to 'sql')
-rw-r--r-- | sql/handler.cc | 26 | ||||
-rw-r--r-- | sql/lock.cc | 103 | ||||
-rw-r--r-- | sql/mysql_priv.h | 2 | ||||
-rw-r--r-- | sql/mysqld.cc | 8 | ||||
-rw-r--r-- | sql/parse_file.cc | 2 | ||||
-rw-r--r-- | sql/set_var.cc | 2 | ||||
-rw-r--r-- | sql/sql_base.cc | 92 | ||||
-rw-r--r-- | sql/sql_class.cc | 2 | ||||
-rw-r--r-- | sql/sql_parse.cc | 4 | ||||
-rw-r--r-- | sql/sql_trigger.cc | 3 |
10 files changed, 170 insertions, 74 deletions
diff --git a/sql/handler.cc b/sql/handler.cc index 594479012df..29aabda1343 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -2643,8 +2643,18 @@ void handler::print_keydup_error(uint key_nr, const char *msg) - table->s->path - table->alias */ + +#ifndef DBUG_OFF +#define SET_FATAL_ERROR fatal_error=1 +#else +#define SET_FATAL_ERROR +#endif + void handler::print_error(int error, myf errflag) { +#ifndef DBUG_OFF + bool fatal_error= 0; +#endif DBUG_ENTER("handler::print_error"); DBUG_PRINT("enter",("error: %d",error)); @@ -2662,6 +2672,13 @@ void handler::print_error(int error, myf errflag) case HA_ERR_KEY_NOT_FOUND: case HA_ERR_NO_ACTIVE_RECORD: case HA_ERR_END_OF_FILE: + /* + This errors is not not normally fatal (for example for reads). However + if you get it during an update or delete, then its fatal. + As the user is calling print_error() (which is not done on read), we + assume something when wrong with the update or delete. + */ + SET_FATAL_ERROR; textno=ER_KEY_NOT_FOUND; break; case HA_ERR_WRONG_MRG_TABLE_DEF: @@ -2713,21 +2730,26 @@ void handler::print_error(int error, myf errflag) textno=ER_DUP_UNIQUE; break; case HA_ERR_RECORD_CHANGED: + SET_FATAL_ERROR; textno=ER_CHECKREAD; break; case HA_ERR_CRASHED: + SET_FATAL_ERROR; textno=ER_NOT_KEYFILE; break; case HA_ERR_WRONG_IN_RECORD: + SET_FATAL_ERROR; textno= ER_CRASHED_ON_USAGE; break; case HA_ERR_CRASHED_ON_USAGE: + SET_FATAL_ERROR; textno=ER_CRASHED_ON_USAGE; break; case HA_ERR_NOT_A_TABLE: textno= error; break; case HA_ERR_CRASHED_ON_REPAIR: + SET_FATAL_ERROR; textno=ER_CRASHED_ON_REPAIR; break; case HA_ERR_OUT_OF_MEM: @@ -2826,7 +2848,10 @@ void handler::print_error(int error, myf errflag) if (temporary) my_error(ER_GET_TEMPORARY_ERRMSG, MYF(0), error, str.ptr(), engine); else + { + SET_FATAL_ERROR; my_error(ER_GET_ERRMSG, MYF(0), error, str.ptr(), engine); + } } else my_error(ER_GET_ERRNO,errflag,error); @@ -2834,6 +2859,7 @@ void handler::print_error(int error, myf errflag) } } my_error(textno, errflag, table_share->table_name.str, error); + DBUG_ASSERT(!fatal_error || !debug_assert_if_crashed_table); DBUG_VOID_RETURN; } diff --git a/sql/lock.cc b/sql/lock.cc index 1908e68dbd2..566275c5ea2 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -211,7 +211,8 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, for (;;) { if (! (sql_lock= get_lock_data(thd, tables, count, GET_LOCK_STORE_LOCKS, - &write_lock_used))) + &write_lock_used)) || + ! sql_lock->table_count) break; if (global_read_lock && write_lock_used && @@ -257,8 +258,7 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, thd_proc_info(thd, "System lock"); DBUG_PRINT("info", ("thd->proc_info %s", thd->proc_info)); - if (sql_lock->table_count && lock_external(thd, sql_lock->table, - sql_lock->table_count)) + if (lock_external(thd, sql_lock->table, sql_lock->table_count)) { /* Clear the lock type of all lock data to avoid reusage. */ reset_lock_data(sql_lock); @@ -279,8 +279,7 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, thd->lock_id)]; if (rc > 1) /* a timeout or a deadlock */ { - if (sql_lock->table_count) - VOID(unlock_external(thd, sql_lock->table, sql_lock->table_count)); + VOID(unlock_external(thd, sql_lock->table, sql_lock->table_count)); my_error(rc, MYF(0)); my_free((uchar*) sql_lock,MYF(0)); sql_lock= 0; @@ -388,7 +387,7 @@ void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock) if (sql_lock->table_count) VOID(unlock_external(thd,sql_lock->table,sql_lock->table_count)); if (sql_lock->lock_count) - thr_multi_unlock(sql_lock->locks,sql_lock->lock_count); + thr_multi_unlock(sql_lock->locks,sql_lock->lock_count, 0); my_free((uchar*) sql_lock,MYF(0)); DBUG_VOID_RETURN; } @@ -418,25 +417,8 @@ void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock) uint i,found; DBUG_ENTER("mysql_unlock_read_tables"); - /* Move all write locks first */ - THR_LOCK_DATA **lock=sql_lock->locks; - for (i=found=0 ; i < sql_lock->lock_count ; i++) - { - if (sql_lock->locks[i]->type >= TL_WRITE_ALLOW_READ) - { - swap_variables(THR_LOCK_DATA *, *lock, sql_lock->locks[i]); - lock++; - found++; - } - } - /* unlock the read locked tables */ - if (i != found) - { - thr_multi_unlock(lock,i-found); - sql_lock->lock_count= found; - } + /* Call external lock for all tables to be unlocked */ - /* Then do the same for the external locks */ /* Move all write locked tables first */ TABLE **table=sql_lock->table; for (i=found=0 ; i < sql_lock->table_count ; i++) @@ -455,6 +437,27 @@ void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock) VOID(unlock_external(thd,table,i-found)); sql_lock->table_count=found; } + + /* Call thr_unlock() for all tables to be unlocked */ + + /* Move all write locks first */ + THR_LOCK_DATA **lock=sql_lock->locks; + for (i=found=0 ; i < sql_lock->lock_count ; i++) + { + if (sql_lock->locks[i]->type >= TL_WRITE_ALLOW_READ) + { + swap_variables(THR_LOCK_DATA *, *lock, sql_lock->locks[i]); + lock++; + found++; + } + } + /* unlock the read locked tables */ + if (i != found) + { + thr_multi_unlock(lock, i-found, 0); + sql_lock->lock_count= found; + } + /* Fix the lock positions in TABLE */ table= sql_lock->table; found= 0; @@ -582,8 +585,21 @@ void mysql_lock_abort(THD *thd, TABLE *table, bool upgrade_lock) if ((locked= get_lock_data(thd, &table, 1, GET_LOCK_UNLOCK, &write_lock_used))) { - for (uint i=0; i < locked->lock_count; i++) - thr_abort_locks(locked->locks[i]->lock, upgrade_lock); + if (table->children_attached) + { + /* + Don't abort locks for underlying tables just because merge table + is deleted. Doing would cause anyone accessing these tables to + spin in open_table/close_table forever until lock is released. + */ + thr_multi_unlock(locked->locks, locked->lock_count, + THR_UNLOCK_UPDATE_STATUS); + } + else + { + for (uint i=0; i < locked->lock_count; i++) + thr_abort_locks(locked->locks[i]->lock, upgrade_lock); + } my_free((uchar*) locked,MYF(0)); } DBUG_VOID_RETURN; @@ -624,21 +640,36 @@ bool mysql_lock_abort_for_thread(THD *thd, TABLE *table) } +/** + Merge two thr_lock:s + mysql_lock_merge() + + @param a Original locks + @param b New locks + + @retval New lock structure that contains a and b + + @note + a and b are freed with my_free() +*/ + MYSQL_LOCK *mysql_lock_merge(MYSQL_LOCK *a,MYSQL_LOCK *b) { MYSQL_LOCK *sql_lock; TABLE **table, **end_table; DBUG_ENTER("mysql_lock_merge"); + DBUG_PRINT("enter", ("a->lock_count: %u b->lock_count: %u", + a->lock_count, b->lock_count)); if (!(sql_lock= (MYSQL_LOCK*) my_malloc(sizeof(*sql_lock)+ - sizeof(THR_LOCK_DATA*)*(a->lock_count+b->lock_count)+ + sizeof(THR_LOCK_DATA*)*((a->lock_count+b->lock_count)*2) + sizeof(TABLE*)*(a->table_count+b->table_count),MYF(MY_WME)))) DBUG_RETURN(0); // Fatal error sql_lock->lock_count=a->lock_count+b->lock_count; sql_lock->table_count=a->table_count+b->table_count; sql_lock->locks=(THR_LOCK_DATA**) (sql_lock+1); - sql_lock->table=(TABLE**) (sql_lock->locks+sql_lock->lock_count); + sql_lock->table=(TABLE**) (sql_lock->locks+sql_lock->lock_count*2); memcpy(sql_lock->locks,a->locks,a->lock_count*sizeof(*a->locks)); memcpy(sql_lock->locks+a->lock_count,b->locks, b->lock_count*sizeof(*b->locks)); @@ -659,6 +690,18 @@ MYSQL_LOCK *mysql_lock_merge(MYSQL_LOCK *a,MYSQL_LOCK *b) (*table)->lock_data_start+= a->lock_count; } + /* + Ensure that locks of the same tables share same data structures if we + reopen a table that is already open. This can happen for example with + MERGE tables. + */ + + /* Copy the lock data array. thr_merge_lock() reorders its content */ + memcpy(sql_lock->locks + sql_lock->lock_count, sql_lock->locks, + sql_lock->lock_count * sizeof(*sql_lock->locks)); + thr_merge_locks(sql_lock->locks + sql_lock->lock_count, + a->lock_count, b->lock_count); + /* Delete old, not needed locks */ my_free((uchar*) a,MYF(0)); my_free((uchar*) b,MYF(0)); @@ -832,7 +875,7 @@ static MYSQL_LOCK *get_lock_data(THD *thd, TABLE **table_ptr, uint count, /* Allocating twice the number of pointers for lock data for use in - thr_mulit_lock(). This function reorders the lock data, but cannot + thr_multi_lock(). This function reorders the lock data, but cannot update the table values. So the second part of the array is copied from the first part immediately before calling thr_multi_lock(). */ @@ -1062,11 +1105,13 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list, bool check_in_use) void unlock_table_name(THD *thd, TABLE_LIST *table_list) { + DBUG_ENTER("unlock_table_name"); if (table_list->table) { hash_delete(&open_cache, (uchar*) table_list->table); broadcast_refresh(); } + DBUG_VOID_RETURN; } diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index c40b19eef75..8b412b421b6 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -2018,7 +2018,7 @@ extern ulong slave_exec_mode_options; extern my_bool opt_readonly, lower_case_file_system; extern my_bool opt_userstat_running; extern my_bool opt_enable_named_pipe, opt_sync_frm, opt_allow_suspicious_udfs; -extern my_bool opt_secure_auth; +extern my_bool opt_secure_auth, debug_assert_if_crashed_table; extern char* opt_secure_file_priv; extern my_bool opt_log_slow_admin_statements, opt_log_slow_slave_statements; extern my_bool sp_automatic_privileges, opt_noacl; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index ce70c65636d..1f6e1c9c4b2 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -467,7 +467,7 @@ static pthread_cond_t COND_thread_cache, COND_flush_thread_cache; /* Global variables */ bool opt_update_log, opt_bin_log, opt_ignore_builtin_innodb= 0; -my_bool opt_log, opt_slow_log; +my_bool opt_log, opt_slow_log, debug_assert_if_crashed_table; my_bool opt_userstat_running; ulong log_output_options; my_bool opt_log_queries_not_using_indexes= 0; @@ -6011,7 +6011,7 @@ enum options_mysqld OPT_SECURE_FILE_PRIV, OPT_MIN_EXAMINED_ROW_LIMIT, OPT_LOG_SLOW_SLAVE_STATEMENTS, - OPT_DEBUG_CRC, OPT_DEBUG_ON, OPT_OLD_MODE, + OPT_DEBUG_CRC, OPT_DEBUG_ON, OPT_DEBUG_ASSERT_IF_CRASHED_TABLE, OPT_OLD_MODE, OPT_TEST_IGNORE_WRONG_OPTIONS, OPT_TEST_RESTART, #if defined(ENABLED_DEBUG_SYNC) OPT_DEBUG_SYNC_TIMEOUT, @@ -6181,6 +6181,10 @@ struct my_option my_long_options[] = 0, GET_ULONG, REQUIRED_ARG, 0, 0, ~(ulong) 0L, 0, 0, 0}, {"debug-flush", OPT_DEBUG_FLUSH, "Default debug log with flush after write", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"debug-assert-if-crashed-table", OPT_DEBUG_ASSERT_IF_CRASHED_TABLE, + "Do an assert in handler::print_error() if we get a crashed table", + &debug_assert_if_crashed_table, &debug_assert_if_crashed_table, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, #endif {"default-character-set", OPT_DEFAULT_CHARACTER_SET_OLD, "Set the default character set (deprecated option, use --character-set-server instead).", diff --git a/sql/parse_file.cc b/sql/parse_file.cc index 3d65fa1de31..5bc16e55ec0 100644 --- a/sql/parse_file.cc +++ b/sql/parse_file.cc @@ -216,7 +216,7 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name, File_option *param; DBUG_ENTER("sql_create_definition_file"); DBUG_PRINT("enter", ("Dir: %s, file: %s, base 0x%lx", - dir ? dir->str : "(null)", + dir ? dir->str : "", file_name->str, (ulong) base)); if (dir) diff --git a/sql/set_var.cc b/sql/set_var.cc index 9a49fa3dad6..95fd2d05f31 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -4352,7 +4352,7 @@ bool sys_var_thd_dbug::update(THD *thd, set_var *var) uchar *sys_var_thd_dbug::value_ptr(THD *thd, enum_var_type type, LEX_STRING *b) { - char buf[256]; + char buf[1024]; if (type == OPT_GLOBAL) { DBUG_EXPLAIN_INITIAL(buf, sizeof(buf)); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index e6ec4f4e7ff..c6260d0a857 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2045,6 +2045,8 @@ static void unlink_open_merge(THD *thd, TABLE *table, TABLE ***prev_pp) Remove parent from open_tables list and close it. This includes detaching and hence clearing parent references. */ + DBUG_PRINT("info", ("Closing parent to '%s'.'%s'", + table->s->db.str, table->s->table_name.str)); close_thread_table(thd, prv_p); } } @@ -3076,8 +3078,9 @@ bool reopen_table(TABLE *table) TABLE_LIST table_list; THD *thd= table->in_use; DBUG_ENTER("reopen_table"); - DBUG_PRINT("tcache", ("table: '%s'.'%s' 0x%lx", table->s->db.str, - table->s->table_name.str, (long) table)); + DBUG_PRINT("tcache", ("table: '%s'.'%s' table: 0x%lx share: 0x%lx", + table->s->db.str, table->s->table_name.str, + (long) table, (long) table->s)); DBUG_ASSERT(table->s->ref_count == 0); DBUG_ASSERT(!table->sort.io_cache); @@ -3364,7 +3367,8 @@ bool reopen_tables(THD *thd, bool get_locks, bool mark_share_as_old) merge_table_found= TRUE; if (!tables || (!db_stat && reopen_table(table))) { - my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->alias); + my_error(ER_CANT_REOPEN_TABLE, MYF(0), + table->alias ? table->alias : table->s->table_name.str); /* If we could not allocate 'tables', we may close open tables here. If a MERGE table is affected, detach the children first. @@ -3374,9 +3378,10 @@ bool reopen_tables(THD *thd, bool get_locks, bool mark_share_as_old) that they cannot be moved into the unused_tables chain with these pointers set. */ - if (table->child_l || table->parent) - detach_merge_children(table, TRUE); - VOID(hash_delete(&open_cache,(uchar*) table)); + unlink_open_table(thd, table, 0); + /* Restart loop */ + prev= &thd->open_tables; + next= *prev; error=1; } else @@ -3411,7 +3416,7 @@ bool reopen_tables(THD *thd, bool get_locks, bool mark_share_as_old) } DBUG_PRINT("tcache", ("open tables to lock: %u", (uint) (tables_ptr - tables))); - if (tables != tables_ptr) // Should we get back old locks + if (tables != tables_ptr) // Should we get back old locks { MYSQL_LOCK *lock; /* @@ -3560,7 +3565,7 @@ bool table_is_used(TABLE *table, bool wait_for_name_lock) char *key= table->s->table_cache_key.str; uint key_length= table->s->table_cache_key.length; - DBUG_PRINT("loop", ("table_name: %s", table->alias)); + DBUG_PRINT("loop", ("table_name: %s", table->alias ? table->alias : "")); HASH_SEARCH_STATE state; for (TABLE *search= (TABLE*) hash_first(&open_cache, (uchar*) key, key_length, &state); @@ -3898,6 +3903,7 @@ static int open_unireg_entry(THD *thd, TABLE *entry, TABLE_LIST *table_list, int error; TABLE_SHARE *share; uint discover_retry_count= 0; + bool locked_table; DBUG_ENTER("open_unireg_entry"); safe_mutex_assert_owner(&LOCK_open); @@ -4018,8 +4024,10 @@ retry: } if (!entry->s || !entry->s->crashed) goto err; - // Code below is for repairing a crashed file - if ((error= lock_table_name(thd, table_list, TRUE))) + + // Code below is for repairing a crashed file + locked_table= table_list->table != 0; + if (! locked_table && (error= lock_table_name(thd, table_list, TRUE))) { if (error < 0) goto err; @@ -4053,12 +4061,13 @@ retry: else thd->clear_error(); // Clear error message pthread_mutex_lock(&LOCK_open); - unlock_table_name(thd, table_list); + if (!locked_table) + unlock_table_name(thd, table_list); if (error) goto err; break; - } + } if (Table_triggers_list::check_n_load(thd, share->db.str, share->table_name.str, entry, 0)) @@ -4286,7 +4295,6 @@ void detach_merge_children(TABLE *table, bool clear_refs) { TABLE_LIST *child_l; TABLE *parent= table->child_l ? table : table->parent; - bool first_detach; DBUG_ENTER("detach_merge_children"); /* Either table->child_l or table->parent must be set. Parent must have @@ -4304,7 +4312,7 @@ void detach_merge_children(TABLE *table, bool clear_refs) children attached yet. Also this is called for every child and the parent from close_thread_tables(). */ - if ((first_detach= parent->children_attached)) + if (parent->children_attached) { VOID(parent->file->extra(HA_EXTRA_DETACH_CHILDREN)); parent->children_attached= FALSE; @@ -4316,38 +4324,50 @@ void detach_merge_children(TABLE *table, bool clear_refs) if (clear_refs) { - /* In any case clear the own parent reference. (***) */ - table->parent= NULL; + if (table->parent) + { + /* In any case clear the own parent reference. (***) */ + table->parent= NULL; + table->file->extra(HA_EXTRA_DETACH_CHILD); + } /* - On the first detach, clear all references. If this table is the - parent, we still may need to clear the child references. The first - detach might not have done this. + Clear all references. If this table is the parent, we still may + need to clear the child references. The first detach might not + have done this. */ - if (first_detach || (table == parent)) + for (child_l= parent->child_l; ; child_l= child_l->next_global) { - /* Clear TABLE references to force new assignment at next open. */ - for (child_l= parent->child_l; ; child_l= child_l->next_global) + /* + Do not DBUG_ASSERT(child_l->table); open_tables might be + incomplete or we may have been called twice. + + Clear the parent reference of the children only on the first + detach. The children might already be closed. They will clear + it themselves when this function is called for them with + 'clear_refs' true. See above "(***)". + */ + if (child_l->table) { + if (child_l->table->parent) + { + child_l->table->parent= NULL; + if (child_l->table->db_stat) + child_l->table->file->extra(HA_EXTRA_DETACH_CHILD); + } /* - Do not DBUG_ASSERT(child_l->table); open_tables might be - incomplete. - - Clear the parent reference of the children only on the first - detach. The children might already be closed. They will clear - it themseves when this function is called for them with - 'clear_refs' true. See above "(***)". + Set alias to "" to ensure that table is not used if we are in + LOCK TABLES */ - if (first_detach && child_l->table) - child_l->table->parent= NULL; + ((char*) child_l->table->alias)[0]= 0; /* Clear the table reference to force new assignment at next open. */ child_l->table= NULL; - - /* Break when this was the last child. */ - if (&child_l->next_global == parent->child_last_l) - break; } + + /* Break when this was the last child. */ + if (&child_l->next_global == parent->child_last_l) + break; } } @@ -5144,9 +5164,11 @@ bool open_normal_and_derived_tables(THD *thd, TABLE_LIST *tables, uint flags) static void mark_real_tables_as_free_for_reuse(TABLE_LIST *table) { + DBUG_ENTER("mark_real_tables_as_free_for_reuse"); for (; table; table= table->next_global) if (!table->placeholder()) table->table->query_id= 0; + DBUG_VOID_RETURN; } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index cac9b624bae..20898d68500 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -327,7 +327,7 @@ const char *set_thd_proc_info(THD *thd, const char *info, const char *old_info= thd->proc_info; DBUG_PRINT("proc_info", ("%s:%d %s", calling_file, calling_line, - (info != NULL) ? info : "(null)")); + (info != NULL) ? info : "")); #if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER) thd->profiling.status_change(info, calling_function, calling_file, calling_line); #endif diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index f06daa4128c..f997bbcfaaf 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -8011,6 +8011,8 @@ bool parse_sql(THD *thd, Object_creation_ctx *creation_ctx) { bool mysql_parse_status; + DBUG_ENTER("parse_sql"); + DBUG_ASSERT(thd->m_parser_state == NULL); /* Backup creation context. */ @@ -8044,7 +8046,7 @@ bool parse_sql(THD *thd, /* That's it. */ - return mysql_parse_status || thd->is_fatal_error; + DBUG_RETURN(mysql_parse_status || thd->is_fatal_error); } /** diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index e8a382ca8f6..f6864add19f 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -498,9 +498,6 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) thd->in_lock_tables= 1; if (reopen_tables(thd, 1, 1)) { - /* To be safe remove this table from the set of LOCKED TABLES */ - unlink_open_table(thd, tables->table, FALSE); - /* Ignore reopen_tables errors for now. It's better not leave master/slave in a inconsistent state. |