diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/ha_myisam.cc | 42 | ||||
-rw-r--r-- | sql/lex.h | 2 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 1 |
3 files changed, 27 insertions, 18 deletions
diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 9c68d1bb4b6..fe22c29c21c 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -246,7 +246,9 @@ int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt) if (!mi_is_crashed(file) && (((param.testflag & T_CHECK_ONLY_CHANGED) && - !share->state.changed && share->state.open_count == 0) || + (share->state.changed & (STATE_CHANGED | STATE_CRASHED | + STATE_CRASHED_ON_REPAIR)) && + share->state.open_count == 0) || ((param.testflag & T_FAST) && share->state.open_count == 0))) return HA_CHECK_ALREADY_CHECKED; @@ -269,14 +271,18 @@ int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt) } if (!error) { - if (share->state.changed || (param.testflag & T_STATISTICS)) + if ((share->state.changed & (STATE_CHANGED | + STATE_CRASHED_ON_REPAIR | + STATE_CRASHED | STATE_NOT_ANALYZED)) || + (param.testflag & T_STATISTICS)) { file->update|=HA_STATE_CHANGED | HA_STATE_ROW_CHANGED; pthread_mutex_lock(&share->intern_lock); #ifndef HAVE_PREAD pthread_mutex_lock(&THR_LOCK_keycache); // QQ; Has to be removed! #endif - share->state.changed=0; + share->state.changed&= ~(STATE_CHANGED | STATE_CRASHED | + STATE_CRASHED_ON_REPAIR); if (!(table->db_stat & HA_READ_ONLY)) error=update_state_info(¶m,file,UPDATE_TIME | UPDATE_OPEN_COUNT | UPDATE_STAT); @@ -306,7 +312,7 @@ int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt) int ha_myisam::analyze(THD *thd) { - int error; + int error=0; MI_CHECK param; MYISAM_SHARE* share = file->s; @@ -318,21 +324,24 @@ int ha_myisam::analyze(THD *thd) T_DONT_CHECK_CHECKSUM); param.using_global_keycache = 1; - error = chk_key(¶m, file); - if (!error) - { - pthread_mutex_lock(&share->intern_lock); + if (share->state.changed & STATE_NOT_ANALYZED) + { + error = chk_key(¶m, file); + if (!error) + { + pthread_mutex_lock(&share->intern_lock); #ifndef HAVE_PREAD - pthread_mutex_lock(&THR_LOCK_keycache); // QQ; Has to be removed! + pthread_mutex_lock(&THR_LOCK_keycache); // QQ; Has to be removed! #endif - error=update_state_info(¶m,file,UPDATE_STAT); + error=update_state_info(¶m,file,UPDATE_STAT); #ifndef HAVE_PREAD - pthread_mutex_unlock(&THR_LOCK_keycache);// QQ; Has to be removed! + pthread_mutex_unlock(&THR_LOCK_keycache);// QQ; Has to be removed! #endif - pthread_mutex_unlock(&share->intern_lock); + pthread_mutex_unlock(&share->intern_lock); + } + else if (!mi_is_crashed(file)) + mi_mark_crashed(file); } - else if (!mi_is_crashed(file)) - mi_mark_crashed(file); return error ? HA_CHECK_CORRUPT : HA_CHECK_OK; } @@ -373,9 +382,10 @@ int ha_myisam::repair(THD *thd, MI_CHECK ¶m) error= mi_repair(¶m, file, fixed_name, param.opt_rep_quick); if (!error) { - if (share->state.changed) + if (share->state.changed & STATE_CHANGED) { - share->state.changed = 0; + share->state.changed&= ~(STATE_CHANGED | STATE_CRASHED | + STATE_CRASHED_ON_REPAIR); file->update|=HA_STATE_CHANGED | HA_STATE_ROW_CHANGED; } file->save_state=file->s->state.state; diff --git a/sql/lex.h b/sql/lex.h index 08fc4d5d2e5..a88bbe76fdd 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -191,7 +191,6 @@ static SYMBOL symbols[] = { { "LONGBLOB", SYM(LONGBLOB),0,0}, { "LONGTEXT", SYM(LONGTEXT),0,0}, { "LOW_PRIORITY", SYM(LOW_PRIORITY),0,0}, - { "MAX", SYM(MAX_SYM),0,0}, { "MASTER", SYM(MASTER_SYM),0,0}, { "MASTER_CONNECT_RETRY", SYM(MASTER_CONNECT_RETRY_SYM),0,0}, { "MASTER_HOST", SYM(MASTER_HOST_SYM),0,0}, @@ -388,6 +387,7 @@ static SYMBOL sql_functions[] = { { "LPAD", SYM(FUNC_ARG3),0,CREATE_FUNC(create_func_lpad)}, { "LTRIM", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ltrim)}, { "MAKE_SET", SYM(MAKE_SET_SYM),0,0}, + { "MAX", SYM(MAX_SYM),0,0}, { "MD5", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_md5)}, { "MID", SYM(SUBSTRING),0,0}, /* unireg function */ { "MIN", SYM(MIN_SYM),0,0}, diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 41d4e32cfd4..3028990fc95 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2367,7 +2367,6 @@ keyword: | LOCAL_SYM {} | LOGS_SYM {} | MAX_ROWS {} - | MAX_SYM {} | MASTER_SYM {} | MASTER_HOST_SYM {} | MASTER_PORT_SYM {} |