Commit b52aa0a7 authored by Mattias Jonsson's avatar Mattias Jonsson
Browse files

merge

parents 3e85defa 8f64bf94
Loading
Loading
Loading
Loading
+83 −0
Original line number Diff line number Diff line
@@ -5760,6 +5760,89 @@ bool ha_partition::get_error_message(int error, String *buf)
/****************************************************************************
                MODULE handler characteristics
****************************************************************************/
/**
  alter_table_flags must be on handler/table level, not on hton level
  due to the ha_partition hton does not know what the underlying hton is.
*/
uint ha_partition::alter_table_flags(uint flags)
{
  DBUG_ENTER("ha_partition::alter_table_flags");
  DBUG_RETURN(ht->alter_table_flags(flags) |
              m_file[0]->alter_table_flags(flags)); 
}


/**
  check if copy of data is needed in alter table.
*/
bool ha_partition::check_if_incompatible_data(HA_CREATE_INFO *create_info,
                                              uint table_changes)
{
  handler **file;
  bool ret;

  /*
    The check for any partitioning related changes have already been done
    in mysql_alter_table (by fix_partition_func), so it is only up to
    the underlying handlers.
  */
  for (file= m_file; *file; file++)
    if ((ret=  (*file)->check_if_incompatible_data(create_info,
                                                   table_changes)) !=
        COMPATIBLE_DATA_YES)
      break;
  return ret;
}


/**
  Support of fast or online add/drop index
*/
int ha_partition::add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys)
{
  handler **file;
  int ret;

  /*
    There has already been a check in fix_partition_func in mysql_alter_table
    before this call, which checks for unique/primary key violations of the
    partitioning function. So no need for extra check here.
  */
  for (file= m_file; *file; file++)
    if ((ret=  (*file)->add_index(table_arg, key_info, num_of_keys)))
      break;
  return ret;
}


int ha_partition::prepare_drop_index(TABLE *table_arg, uint *key_num,
                                 uint num_of_keys)
{
  handler **file;
  int ret;

  /*
    DROP INDEX does not affect partitioning.
  */
  for (file= m_file; *file; file++)
    if ((ret=  (*file)->prepare_drop_index(table_arg, key_num, num_of_keys)))
      break;
  return ret;
}


int ha_partition::final_drop_index(TABLE *table_arg)
{
  handler **file;
  int ret= HA_ERR_WRONG_COMMAND;

  for (file= m_file; *file; file++)
    if ((ret=  (*file)->final_drop_index(table_arg)))
      break;
  return ret;
}


/*
  If frm_error() is called then we will use this to to find out what file
  extensions exist for the storage engine. This is also used by the default
+13 −5
Original line number Diff line number Diff line
@@ -224,6 +224,8 @@ class ha_partition :public handler
    DBUG_RETURN(0);
  }
  virtual void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share);
  virtual bool check_if_incompatible_data(HA_CREATE_INFO *create_info,
                                          uint table_changes);
private:
  int prepare_for_rename();
  int copy_partitions(ulonglong * const copied, ulonglong * const deleted);
@@ -774,6 +776,11 @@ class ha_partition :public handler
    return m_file[0]->index_flags(inx, part, all_parts);
  }

  /**
    wrapper function for handlerton alter_table_flags, since
    the ha_partition_hton cannot know all its capabilities
  */
  virtual uint alter_table_flags(uint flags);
  /*
     extensions of table handler files
  */
@@ -949,13 +956,14 @@ class ha_partition :public handler
    -------------------------------------------------------------------------
    MODULE on-line ALTER TABLE
    -------------------------------------------------------------------------
    These methods are in the handler interface but never used (yet)
    They are to be used by on-line alter table add/drop index:
    These methods are in the handler interface. (used by innodb-plugin)
    They are used for on-line/fast alter table add/drop index:
    -------------------------------------------------------------------------
    virtual ulong index_ddl_flags(KEY *wanted_index) const
    virtual int add_index(TABLE *table_arg,KEY *key_info,uint num_of_keys);
    virtual int drop_index(TABLE *table_arg,uint *key_num,uint num_of_keys);
  */
  virtual int add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys);
  virtual int prepare_drop_index(TABLE *table_arg, uint *key_num,
                                 uint num_of_keys);
  virtual int final_drop_index(TABLE *table_arg);

  /*
    -------------------------------------------------------------------------
+1 −2
Original line number Diff line number Diff line
@@ -4251,8 +4251,7 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
        alter_info->no_parts= curr_part_no - new_part_no;
      }
    }
    if (table->s->db_type()->alter_table_flags &&
        (!(flags= table->s->db_type()->alter_table_flags(alter_info->flags))))
    if (!(flags= table->file->alter_table_flags(alter_info->flags)))
    {
      my_error(ER_PARTITION_FUNCTION_FAILURE, MYF(0));
      DBUG_RETURN(1);
+3 −3
Original line number Diff line number Diff line
@@ -6454,8 +6454,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
    uint  *idx_p;
    uint  *idx_end_p;

    if (table->s->db_type()->alter_table_flags)
      alter_flags= table->s->db_type()->alter_table_flags(alter_info->flags);
    alter_flags= table->file->alter_table_flags(alter_info->flags);
    DBUG_PRINT("info", ("alter_flags: %lu", alter_flags));
    /* Check dropped indexes. */
    for (idx_p= index_drop_buffer, idx_end_p= idx_p + index_drop_count;
@@ -6725,7 +6724,6 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
  /* Copy the data if necessary. */
  thd->count_cuted_fields= CHECK_FIELD_WARN;	// calc cuted fields
  thd->cuted_fields=0L;
  thd_proc_info(thd, "copy to tmp table");
  copied=deleted=0;
  /*
    We do not copy data for MERGE tables. Only the children have data.
@@ -6736,6 +6734,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
    /* We don't want update TIMESTAMP fields during ALTER TABLE. */
    new_table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
    new_table->next_number_field=new_table->found_next_number_field;
    thd_proc_info(thd, "copy to tmp table");
    error= copy_data_between_tables(table, new_table,
                                    alter_info->create_list, ignore,
                                    order_num, order, &copied, &deleted,
@@ -6747,6 +6746,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
    VOID(pthread_mutex_lock(&LOCK_open));
    wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN);
    VOID(pthread_mutex_unlock(&LOCK_open));
    thd_proc_info(thd, "manage keys");
    alter_table_manage_keys(table, table->file->indexes_are_disabled(),
                            alter_info->keys_onoff);
    error= ha_autocommit_or_rollback(thd, 0);
+1 −1

File changed.

Contains only whitespace changes.