summaryrefslogtreecommitdiffstats
path: root/storage/maria/ha_maria.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/maria/ha_maria.cc')
-rw-r--r--storage/maria/ha_maria.cc106
1 files changed, 43 insertions, 63 deletions
diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc
index 66dd9867..b3b0ba0f 100644
--- a/storage/maria/ha_maria.cc
+++ b/storage/maria/ha_maria.cc
@@ -38,6 +38,7 @@ C_MODE_START
#include "ma_recovery.h"
C_MODE_END
#include "ma_trnman.h"
+#include "ma_loghandler.h"
//#include "sql_priv.h"
#include "protocol.h"
@@ -45,6 +46,7 @@ C_MODE_END
#include "key.h"
#include "log.h"
#include "sql_parse.h"
+#include "mysql/service_print_check_msg.h"
#include "debug.h"
/*
@@ -428,10 +430,8 @@ static void _ma_check_print_msg(HA_CHECK *param, const LEX_CSTRING *msg_type,
const char *fmt, va_list args)
{
THD *thd= (THD *) param->thd;
- Protocol *protocol= thd->protocol;
- size_t length, msg_length;
+ size_t msg_length __attribute__((unused));
char msgbuf[MYSQL_ERRMSG_SIZE];
- char name[NAME_LEN * 2 + 2];
if (param->testflag & T_SUPPRESS_ERR_HANDLING)
return;
@@ -460,27 +460,10 @@ static void _ma_check_print_msg(HA_CHECK *param, const LEX_CSTRING *msg_type,
_ma_check_print(param, msg_type, msgbuf);
return;
}
- length= (uint) (strxmov(name, param->db_name, ".", param->table_name,
- NullS) - name);
- /*
- TODO: switch from protocol to push_warning here. The main reason we didn't
- it yet is parallel repair, which threads have no THD object accessible via
- current_thd.
-
- Also we likely need to lock mutex here (in both cases with protocol and
- push_warning).
- */
- protocol->prepare_for_resend();
- protocol->store(name, (uint)length, system_charset_info);
- protocol->store(param->op_name, strlen(param->op_name), system_charset_info);
- protocol->store(msg_type, system_charset_info);
- protocol->store(msgbuf, msg_length, system_charset_info);
- if (protocol->write())
- sql_print_error("Failed on my_net_write, writing to stderr instead: %s.%s: %s\n",
- param->db_name, param->table_name, msgbuf);
- else if (thd->variables.log_warnings > 2)
+ print_check_msg(thd, param->db_name, param->table_name,
+ param->op_name, msg_type->str, msgbuf, 0);
+ if (thd->variables.log_warnings > 2)
_ma_check_print(param, msg_type, msgbuf);
-
return;
}
@@ -1952,41 +1935,46 @@ int ha_maria::preload_keys(THD * thd, HA_CHECK_OPT *check_opt)
SYNOPSIS
disable_indexes()
- mode mode of operation:
- HA_KEY_SWITCH_NONUNIQ disable all non-unique keys
- HA_KEY_SWITCH_ALL disable all keys
- HA_KEY_SWITCH_NONUNIQ_SAVE dis. non-uni. and make persistent
- HA_KEY_SWITCH_ALL_SAVE dis. all keys and make persistent
- IMPLEMENTATION
- HA_KEY_SWITCH_NONUNIQ is not implemented.
- HA_KEY_SWITCH_ALL_SAVE is not implemented.
+ DESCRIPTION
+ See handler::ha_disable_indexes()
RETURN
0 ok
HA_ERR_WRONG_COMMAND mode not implemented.
*/
-int ha_maria::disable_indexes(uint mode)
+int ha_maria::disable_indexes(key_map map, bool persist)
{
int error;
- if (mode == HA_KEY_SWITCH_ALL)
+ if (!persist)
{
/* call a storage engine function to switch the key map */
+ DBUG_ASSERT(map.is_clear_all());
error= maria_disable_indexes(file);
}
- else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE)
+ else
{
- maria_extra(file, HA_EXTRA_NO_KEYS, 0);
+ /* auto-inc key cannot be disabled */
+ if (table->s->next_number_index < MAX_KEY)
+ DBUG_ASSERT(map.is_set(table->s->next_number_index));
+
+ /* unique keys cannot be disabled either */
+ for (uint i=0; i < table->s->keys; i++)
+ DBUG_ASSERT(!(table->key_info[i].flags & HA_NOSAME) || map.is_set(i));
+
+ ulonglong ullmap= map.to_ulonglong();
+
+ /* make sure auto-inc key is enabled even if it's > 64 */
+ if (map.length() > MARIA_KEYMAP_BITS &&
+ table->s->next_number_index < MAX_KEY)
+ maria_set_key_active(ullmap, table->s->next_number_index);
+
+ maria_extra(file, HA_EXTRA_NO_KEYS, &ullmap);
info(HA_STATUS_CONST); // Read new key info
error= 0;
}
- else
- {
- /* mode not implemented */
- error= HA_ERR_WRONG_COMMAND;
- }
return error;
}
@@ -1996,21 +1984,14 @@ int ha_maria::disable_indexes(uint mode)
SYNOPSIS
enable_indexes()
- mode mode of operation:
- HA_KEY_SWITCH_NONUNIQ enable all non-unique keys
- HA_KEY_SWITCH_ALL enable all keys
- HA_KEY_SWITCH_NONUNIQ_SAVE en. non-uni. and make persistent
- HA_KEY_SWITCH_ALL_SAVE en. all keys and make persistent
DESCRIPTION
Enable indexes, which might have been disabled by disable_index() before.
- The modes without _SAVE work only if both data and indexes are empty,
- since the MARIA repair would enable them persistently.
+ If persist=false, it works only if both data and indexes are empty,
+ since the Aria repair would enable them persistently.
To be sure in these cases, call handler::delete_all_rows() before.
- IMPLEMENTATION
- HA_KEY_SWITCH_NONUNIQ is not implemented.
- HA_KEY_SWITCH_ALL_SAVE is not implemented.
+ See also handler::ha_enable_indexes()
RETURN
0 ok
@@ -2019,18 +2000,19 @@ int ha_maria::disable_indexes(uint mode)
HA_ERR_WRONG_COMMAND mode not implemented.
*/
-int ha_maria::enable_indexes(uint mode)
+int ha_maria::enable_indexes(key_map map, bool persist)
{
int error;
ha_rows start_rows= file->state->records;
- DBUG_PRINT("info", ("ha_maria::enable_indexes mode: %d", mode));
+ DBUG_PRINT("info", ("ha_maria::enable_indexes mode: %d", persist));
if (maria_is_all_keys_active(file->s->state.key_map, file->s->base.keys))
{
/* All indexes are enabled already. */
return 0;
}
- if (mode == HA_KEY_SWITCH_ALL)
+ DBUG_ASSERT(map.is_prefix(table->s->keys));
+ if (!persist)
{
error= maria_enable_indexes(file);
/*
@@ -2039,7 +2021,7 @@ int ha_maria::enable_indexes(uint mode)
but mode==HA_KEY_SWITCH_ALL forbids it.
*/
}
- else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE)
+ else
{
THD *thd= table->in_use;
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
@@ -2104,11 +2086,6 @@ int ha_maria::enable_indexes(uint mode)
info(HA_STATUS_CONST);
thd_proc_info(thd, save_proc_info);
}
- else
- {
- /* mode not implemented */
- error= HA_ERR_WRONG_COMMAND;
- }
DBUG_EXECUTE_IF("maria_flush_whole_log",
{
DBUG_PRINT("maria_flush_whole_log", ("now"));
@@ -2311,7 +2288,7 @@ int ha_maria::end_bulk_insert()
{
int first_error, first_errno= 0, error;
my_bool abort= file->s->deleting, empty_table= 0;
- uint enable_index_mode= HA_KEY_SWITCH_NONUNIQ_SAVE;
+ bool enable_persistently= true;
DBUG_ENTER("ha_maria::end_bulk_insert");
if ((first_error= maria_end_bulk_insert(file, abort)))
@@ -2340,7 +2317,7 @@ int ha_maria::end_bulk_insert()
first_error= 1;
first_errno= my_errno;
}
- enable_index_mode= HA_KEY_SWITCH_ALL;
+ enable_persistently= false;
empty_table= 1;
/*
Ignore all changed pages, required by _ma_renable_logging_for_table()
@@ -2352,7 +2329,7 @@ int ha_maria::end_bulk_insert()
if (!abort && can_enable_indexes)
{
- if ((error= enable_indexes(enable_index_mode)))
+ if ((error= enable_indexes(key_map(table->s->keys), enable_persistently)))
{
if (!first_error)
{
@@ -3361,6 +3338,8 @@ int ha_maria::create(const char *name, TABLE *table_arg,
if (ha_create_info->tmp_table())
{
create_flags|= HA_CREATE_TMP_TABLE | HA_CREATE_DELAY_KEY_WRITE;
+ if (ha_create_info->options & HA_LEX_CREATE_GLOBAL_TMP_TABLE)
+ create_flags|= HA_CREATE_GLOBAL_TMP_TABLE;
create_info.transactional= 0;
}
if (ha_create_info->options & HA_CREATE_KEEP_FILES)
@@ -3894,7 +3873,8 @@ static int ha_maria_init(void *p)
if (!aria_readonly)
res= maria_upgrade();
res= res || maria_init();
- tmp= ma_control_file_open(!aria_readonly, !aria_readonly, !aria_readonly);
+ tmp= ma_control_file_open(!aria_readonly, !aria_readonly, !aria_readonly,
+ control_file_open_flags);
res= res || aria_readonly ? tmp == CONTROL_FILE_LOCKED : tmp != 0;
res= res ||
((force_start_after_recovery_failures != 0 && !aria_readonly) &&