Commit de717a99 authored by unknown's avatar unknown

WL 2826: Error handling of ALTER TABLE for partitioning

Fix compiler issues


sql/ha_heap.cc:
  Fix compiler warnings
sql/ha_myisammrg.cc:
  Fix compiler warnings
sql/log.cc:
  Fix compiler warnings
sql/sql_partition.cc:
  Fix compiler issues
sql/sql_table.cc:
  Fix compiler issues
parent f52e37ad
...@@ -57,7 +57,9 @@ handlerton heap_hton= { ...@@ -57,7 +57,9 @@ handlerton heap_hton= {
NULL, /* Partition flags */ NULL, /* Partition flags */
NULL, /* Alter table flags */ NULL, /* Alter table flags */
NULL, /* Alter Tablespace */ NULL, /* Alter Tablespace */
HTON_CAN_RECREATE HTON_CAN_RECREATE,
NULL, /* binlog func */
NULL /* binlog query */
}; };
static handler *heap_create_handler(TABLE_SHARE *table) static handler *heap_create_handler(TABLE_SHARE *table)
......
...@@ -67,7 +67,9 @@ handlerton myisammrg_hton= { ...@@ -67,7 +67,9 @@ handlerton myisammrg_hton= {
NULL, /* Partition flags */ NULL, /* Partition flags */
NULL, /* Alter table flags */ NULL, /* Alter table flags */
NULL, /* Alter Tablespace */ NULL, /* Alter Tablespace */
HTON_CAN_RECREATE HTON_CAN_RECREATE,
NULL, /* binlog func */
NULL /* binlog query */
}; };
static handler *myisammrg_create_handler(TABLE_SHARE *table) static handler *myisammrg_create_handler(TABLE_SHARE *table)
......
...@@ -101,7 +101,9 @@ handlerton binlog_hton = { ...@@ -101,7 +101,9 @@ handlerton binlog_hton = {
NULL, /* Partition flags */ NULL, /* Partition flags */
NULL, /* Alter table flags */ NULL, /* Alter table flags */
NULL, /* Alter Tablespace */ NULL, /* Alter Tablespace */
HTON_NOT_USER_SELECTABLE | HTON_HIDDEN HTON_NOT_USER_SELECTABLE | HTON_HIDDEN,
NULL, /* binlog func */
NULL /* binlog query */
}; };
......
...@@ -5116,6 +5116,7 @@ release_part_info_log_entries(TABLE_LOG_MEMORY_ENTRY *log_entry) ...@@ -5116,6 +5116,7 @@ release_part_info_log_entries(TABLE_LOG_MEMORY_ENTRY *log_entry)
the partition info object the partition info object
*/ */
static
bool bool
write_log_replace_delete_frm(ALTER_PARTITION_PARAM_TYPE *lpt, write_log_replace_delete_frm(ALTER_PARTITION_PARAM_TYPE *lpt,
uint next_entry, uint next_entry,
...@@ -5719,7 +5720,7 @@ write_log_completed(ALTER_PARTITION_PARAM_TYPE *lpt, bool dont_crash) ...@@ -5719,7 +5720,7 @@ write_log_completed(ALTER_PARTITION_PARAM_TYPE *lpt, bool dont_crash)
static static
void void
release_log_entries(partition *part_info) release_log_entries(partition_info *part_info)
{ {
lock_global_table_log(); lock_global_table_log();
release_part_info_log_entries(part_info->first_log_entry); release_part_info_log_entries(part_info->first_log_entry);
...@@ -5748,7 +5749,7 @@ handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, bool not_completed, ...@@ -5748,7 +5749,7 @@ handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, bool not_completed,
DBUG_ENTER("handle_alter_part_error"); DBUG_ENTER("handle_alter_part_error");
if (!part_info->first_log_entry && if (!part_info->first_log_entry &&
execute_table_log_entry(part_info->first_log_entry)) execute_table_log_entry(part_info->first_log_entry->entry_pos))
{ {
/* /*
We couldn't recover from error, most likely manual interaction is required. We couldn't recover from error, most likely manual interaction is required.
...@@ -5757,19 +5758,24 @@ handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, bool not_completed, ...@@ -5757,19 +5758,24 @@ handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, bool not_completed,
release_log_entries(part_info); release_log_entries(part_info);
if (not_completed) if (not_completed)
{ {
char *text1= "Operation was unsuccessful, table is still intact, "; char *text1=
(char*)"Operation was unsuccessful, table is still intact, ";
if (drop_partition) if (drop_partition)
{ {
/* Table is still ok, but we left a shadow frm file behind. */ /* Table is still ok, but we left a shadow frm file behind. */
char *text2= "but it is possible that a shadow frm file was left behind"; char *text2=
(char*)"but it is possible that a shadow frm file was left behind";
push_warning_printf(lpt->thd, MYSQL_ERROR::WARN_LEVEL_WARN, 1, push_warning_printf(lpt->thd, MYSQL_ERROR::WARN_LEVEL_WARN, 1,
"%s \n %s", text1, text2); "%s \n %s", text1, text2);
} }
else else
{ {
char *text2= "but it is possible that a shadow frm file was left behind."; char *text2=
char *text3= "It is also possible that temporary partitions are left behind, "; (char*)"but it is possible that a shadow frm file was left behind.";
char *text4= "these could be empty or more or less filled with records"; char *text3=
(char*)"It is also possible that temporary partitions are left behind, ";
char *text4=
(char*)"these could be empty or more or less filled with records";
push_warning_printf(lpt->thd, MYSQL_ERROR::WARN_LEVEL_WARN, 1, push_warning_printf(lpt->thd, MYSQL_ERROR::WARN_LEVEL_WARN, 1,
"%s \n %s \n %s \n %s", text1, text2, text3, text4); "%s \n %s \n %s \n %s", text1, text2, text3, text4);
} }
...@@ -5782,11 +5788,14 @@ handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, bool not_completed, ...@@ -5782,11 +5788,14 @@ handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, bool not_completed,
Failed during install of shadow frm file, table isn't intact Failed during install of shadow frm file, table isn't intact
and dropped partitions are still there and dropped partitions are still there
*/ */
char *text1= "Failed during alter of partitions, table is no longer intact, "; char *text1=
char *text2= "The frm file is in an unknown state, and a backup"; (char*)"Failed during alter of partitions, table is no longer intact, ";
char *text3= " is required. char *text2=
push_warning_print(lpt->thd, MYSQL_ERROR::WARN_LEVEL_WARN, 1, (char*)"The frm file is in an unknown state, and a backup";
"%s \n %s%s\n", text1, text2, text3); char *text3=
(char*)" is required.";
push_warning_printf(lpt->thd, MYSQL_ERROR::WARN_LEVEL_WARN, 1,
"%s \n %s%s\n", text1, text2, text3);
} }
else if (drop_partition) else if (drop_partition)
{ {
...@@ -5796,10 +5805,12 @@ handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, bool not_completed, ...@@ -5796,10 +5805,12 @@ handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, bool not_completed,
perform the action manually. We remove the log records and ask the user perform the action manually. We remove the log records and ask the user
to perform the action manually. to perform the action manually.
*/ */
char *text1= "Failed during drop of partitions, table is intact, "; char *text1=
char *text2= "Manual drop of remaining partitions is required"; (char*)"Failed during drop of partitions, table is intact, ";
push_warning_print(lpt->thd, MYSQL_ERROR::WARN_LEVEL_WARN, 1, char *text2=
"%s\n%s", text1, text2); (char*)"Manual drop of remaining partitions is required";
push_warning_printf(lpt->thd, MYSQL_ERROR::WARN_LEVEL_WARN, 1,
"%s\n%s", text1, text2);
} }
else else
{ {
...@@ -5808,11 +5819,14 @@ handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, bool not_completed, ...@@ -5808,11 +5819,14 @@ handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, bool not_completed,
a very bad state so we give user warning and disable the table by a very bad state so we give user warning and disable the table by
writing an ancient frm version into it. writing an ancient frm version into it.
*/ */
char *text1= "Failed during renaming of partitions. We are now in a position" char *text1=
char *text2= " where table is not reusable"; (char*)"Failed during renaming of partitions. We are now in a position";
char *text3= "Table is disabled by writing ancient frm file version into it"; char *text2=
push_warning_print(lpt->thd, MYSQL_ERROR::WARN_LEVEL_WARN, 1, (char*)" where table is not reusable";
"%s%s\n%s", text1, text2, text3); char *text3=
(char*)"Table is disabled by writing ancient frm file version into it";
push_warning_printf(lpt->thd, MYSQL_ERROR::WARN_LEVEL_WARN, 1,
"%s%s\n%s", text1, text2, text3);
} }
} }
...@@ -5839,7 +5853,7 @@ handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, bool not_completed, ...@@ -5839,7 +5853,7 @@ handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, bool not_completed,
completed. completed.
*/ */
push_warning(lpt->thd, MYSQL_ERROR::WARN_LEVEL_WARN, 1, push_warning(lpt->thd, MYSQL_ERROR::WARN_LEVEL_WARN, 1,
"Operation was successfully completed after failure of normal operation"); "Operation was successfully completed after failure of normal operation");
} }
} }
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -5924,15 +5938,16 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, ...@@ -5924,15 +5938,16 @@ uint fast_alter_partition_table(THD *thd, TABLE *table,
In this case it is enough to call optimise_partitions, there is no In this case it is enough to call optimise_partitions, there is no
need to change frm files or anything else. need to change frm files or anything else.
*/ */
int error;
written_bin_log= FALSE; written_bin_log= FALSE;
if (((alter_info->flags & ALTER_OPTIMIZE_PARTITION) && if (((alter_info->flags & ALTER_OPTIMIZE_PARTITION) &&
(table->file->optimize_partitions(thd))) || (error= table->file->optimize_partitions(thd))) ||
((alter_info->flags & ALTER_ANALYZE_PARTITION) && ((alter_info->flags & ALTER_ANALYZE_PARTITION) &&
(table->file->analyze_partitions(thd))) || (error= table->file->analyze_partitions(thd))) ||
((alter_info->flags & ALTER_CHECK_PARTITION) && ((alter_info->flags & ALTER_CHECK_PARTITION) &&
(table->file->check_partitions(thd))) || (error= table->file->check_partitions(thd))) ||
((alter_info->flags & ALTER_REPAIR_PARTITION) && ((alter_info->flags & ALTER_REPAIR_PARTITION) &&
(table->file->repair_partitions(thd)))) (error= table->file->repair_partitions(thd))))
{ {
table->file->print_error(error, MYF(0)); table->file->print_error(error, MYF(0));
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
......
...@@ -321,7 +321,7 @@ read_table_log_file_entry(uint entry_no) ...@@ -321,7 +321,7 @@ read_table_log_file_entry(uint entry_no)
DBUG_ENTER("read_table_log_file_entry"); DBUG_ENTER("read_table_log_file_entry");
if (my_pread(file_id, file_entry, io_size, io_size * entry_no, if (my_pread(file_id, file_entry, io_size, io_size * entry_no,
MYF(MY_WME))) MYF(MY_WME)) != IO_SIZE)
error= TRUE; error= TRUE;
DBUG_RETURN(error); DBUG_RETURN(error);
} }
...@@ -549,23 +549,24 @@ execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry) ...@@ -549,23 +549,24 @@ execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry)
bool frm_action= FALSE; bool frm_action= FALSE;
LEX_STRING handler_name; LEX_STRING handler_name;
handler *file; handler *file;
MEMROOT mem_root; MEM_ROOT mem_root;
bool= error= TRUE; bool error= TRUE;
char path[FN_REFLEN]; char path[FN_REFLEN];
char from_path[FN_REFLEN]; char from_path[FN_REFLEN];
char *par_ext= ".par"; char *par_ext= (char*)".par";
handlerton *hton;
DBUG_ENTER("execute_table_log_action"); DBUG_ENTER("execute_table_log_action");
if (table_log_entry->entry_type == TLOG_IGNORE_LOG_ENTRY_CODE) if (table_log_entry->entry_type == TLOG_IGNORE_LOG_ENTRY_CODE)
{ {
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }
handler_name.str= table_log_entry->handler_type; handler_name.str= (char*)table_log_entry->handler_type;
handler_name.length= strlen(table_log_entry->handler_type); handler_name.length= strlen(table_log_entry->handler_type);
hton= ha_resolve_by_name(current_thd, handler_name); hton= ha_resolve_by_name(current_thd, &handler_name);
if (!hton) if (!hton)
{ {
my_error(ER_ILLEGAL_HA, table_log_entry->handler_type); my_error(ER_ILLEGAL_HA, MYF(0), table_log_entry->handler_type);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
init_sql_alloc(&mem_root, TABLE_ALLOC_BLOCK_SIZE, 0); init_sql_alloc(&mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
...@@ -573,7 +574,9 @@ execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry) ...@@ -573,7 +574,9 @@ execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry)
frm_action= TRUE; frm_action= TRUE;
else else
{ {
file= get_new_handler(table_share, &mem_root, hton); TABLE_SHARE dummy;
bzero(&dummy, sizeof(TABLE_SHARE));
file= get_new_handler(&dummy, &mem_root, hton);
if (!file) if (!file)
{ {
mem_alloc_error(sizeof(handler)); mem_alloc_error(sizeof(handler));
...@@ -581,10 +584,12 @@ execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry) ...@@ -581,10 +584,12 @@ execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry)
} }
} }
switch (table_log_entry->action_type) switch (table_log_entry->action_type)
case TLOG_ACTION_DELETE_CODE: {
case TLOG_ACTION_REPLACE_CODE: case TLOG_DELETE_ACTION_CODE:
if (table_log_entry->action_type == TLOG_ACTION_DELETE_CODE || case TLOG_REPLACE_ACTION_CODE:
(table_log_entry->action_type == TLOG_ACTION_REPLACE_CODE && {
if (table_log_entry->action_type == TLOG_DELETE_ACTION_CODE ||
(table_log_entry->action_type == TLOG_REPLACE_ACTION_CODE &&
table_log_entry->phase == 0UL)) table_log_entry->phase == 0UL))
{ {
if (frm_action) if (frm_action)
...@@ -598,7 +603,7 @@ execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry) ...@@ -598,7 +603,7 @@ execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry)
} }
else else
{ {
if (file->delete_table(table_name)) if (file->delete_table(table_log_entry->name))
break; break;
} }
if ((!inactivate_table_log_entry(table_log_entry->entry_pos))) if ((!inactivate_table_log_entry(table_log_entry->entry_pos)))
...@@ -610,9 +615,11 @@ execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry) ...@@ -610,9 +615,11 @@ execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry)
} }
break; break;
} }
if (table_log_entry->action_type == TLOG_ACTION_DELETE_CODE) if (table_log_entry->action_type == TLOG_DELETE_ACTION_CODE)
break; break;
case TLOG_ACTION_RENAME_CODE: }
case TLOG_RENAME_ACTION_CODE:
{
error= TRUE; error= TRUE;
if (frm_action) if (frm_action)
{ {
...@@ -639,6 +646,7 @@ execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry) ...@@ -639,6 +646,7 @@ execute_table_log_action(TABLE_LOG_ENTRY *table_log_entry)
} }
} }
break; break;
}
default: default:
DBUG_ASSERT(0); DBUG_ASSERT(0);
break; break;
...@@ -978,7 +986,7 @@ execute_table_log_entry(uint first_entry) ...@@ -978,7 +986,7 @@ execute_table_log_entry(uint first_entry)
DBUG_ASSERT(table_log_entry.entry_type == TLOG_LOG_ENTRY_CODE || DBUG_ASSERT(table_log_entry.entry_type == TLOG_LOG_ENTRY_CODE ||
table_log_entry.entry_type == TLOG_IGNORE_LOG_ENTRY_CODE); table_log_entry.entry_type == TLOG_IGNORE_LOG_ENTRY_CODE);
if (execute_table_log_action(file, &table_log_entry)) if (execute_table_log_action(&table_log_entry))
{ {
DBUG_ASSERT(0); DBUG_ASSERT(0);
/* Write to error log and continue with next log entry */ /* Write to error log and continue with next log entry */
...@@ -1028,7 +1036,6 @@ execute_table_log_recovery() ...@@ -1028,7 +1036,6 @@ execute_table_log_recovery()
} }
} }
} }
release_handler_objects();
VOID(init_table_log()); VOID(init_table_log());
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -1231,6 +1238,9 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) ...@@ -1231,6 +1238,9 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
} }
if (flags & WFRM_INSTALL_SHADOW) if (flags & WFRM_INSTALL_SHADOW)
{ {
#ifdef WITH_PARTITION_STORAGE_ENGINE
partition_info *part_info= lpt->part_info;
#endif
/* /*
Build frm file name Build frm file name
*/ */
...@@ -1243,17 +1253,21 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) ...@@ -1243,17 +1253,21 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
*/ */
VOID(pthread_mutex_lock(&LOCK_open)); VOID(pthread_mutex_lock(&LOCK_open));
if (my_delete(frm_name, MYF(MY_WME)) || if (my_delete(frm_name, MYF(MY_WME)) ||
#ifdef WITH_PARTITION_STORAGE_ENGINE
inactivate_table_log_entry(part_info->frm_log_entry->entry_pos) || inactivate_table_log_entry(part_info->frm_log_entry->entry_pos) ||
(sync_table_log(), FALSE) || (sync_table_log(), FALSE) ||
#endif
my_rename(shadow_frm_name, frm_name, MYF(MY_WME)) || my_rename(shadow_frm_name, frm_name, MYF(MY_WME)) ||
lpt->table->file->create_handler_files(path, shadow_path, TRUE)) lpt->table->file->create_handler_files(path, shadow_path, TRUE))
{ {
error= 1; error= 1;
} }
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
#ifdef WITH_PARTITION_STORAGE_ENGINE
inactivate_table_log_entry(part_info->frm_log_entry->entry_pos); inactivate_table_log_entry(part_info->frm_log_entry->entry_pos);
part_info->frm_log_entry= NULL; part_info->frm_log_entry= NULL;
VOID(sync_table_log()); VOID(sync_table_log());
#endif
} }
end: end:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment