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

Bug#39434: ALTER TABLE CHECK/OPTIMIZE/ANALYZE PARTITION work

on non-partitioned table

Problem was that partitioning specific commands was accepted
for non partitioned tables and treated like
ANALYZE/CHECK/OPTIMIZE/REPAIR TABLE, after bug-20129 was fixed,
which changed the code path from mysql_alter_table to
mysql_admin_table.

Solution was to check if the table was partitioned before
trying to execute the admin command
parent e142ffde
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -84,6 +84,14 @@ ALTER TABLE t1 DROP PARTITION x1;
ERROR HY000: Partition management on a not partitioned table is not possible
ALTER TABLE t1 COALESCE PARTITION 1;
ERROR HY000: Partition management on a not partitioned table is not possible
ALTER TABLE t1 ANALYZE PARTITION p1;
ERROR HY000: Partition management on a not partitioned table is not possible
ALTER TABLE t1 CHECK PARTITION p1;
ERROR HY000: Partition management on a not partitioned table is not possible
ALTER TABLE t1 OPTIMIZE PARTITION p1;
ERROR HY000: Partition management on a not partitioned table is not possible
ALTER TABLE t1 REPAIR PARTITION p1;
ERROR HY000: Partition management on a not partitioned table is not possible
DROP TABLE t1;
CREATE TABLE t1 (a int)
PARTITION BY KEY (a)
+12 −0
Original line number Diff line number Diff line
@@ -125,6 +125,18 @@ ALTER TABLE t1 DROP PARTITION x1;
--error ER_PARTITION_MGMT_ON_NONPARTITIONED
ALTER TABLE t1 COALESCE PARTITION 1;

--error ER_PARTITION_MGMT_ON_NONPARTITIONED
ALTER TABLE t1 ANALYZE PARTITION p1;

--error ER_PARTITION_MGMT_ON_NONPARTITIONED
ALTER TABLE t1 CHECK PARTITION p1;

--error ER_PARTITION_MGMT_ON_NONPARTITIONED
ALTER TABLE t1 OPTIMIZE PARTITION p1;

--error ER_PARTITION_MGMT_ON_NONPARTITIONED
ALTER TABLE t1 REPAIR PARTITION p1;

DROP TABLE t1;

CREATE TABLE t1 (a int)
+8 −20
Original line number Diff line number Diff line
@@ -876,10 +876,7 @@ int ha_partition::optimize(THD *thd, HA_CHECK_OPT *check_opt)
{
  DBUG_ENTER("ha_partition::optimize");

  DBUG_RETURN(handle_opt_partitions(thd, check_opt, 
                                    OPTIMIZE_PARTS,
                                    thd->lex->alter_info.flags &
                                    ALTER_OPTIMIZE_PARTITION ? FALSE : TRUE));
  DBUG_RETURN(handle_opt_partitions(thd, check_opt, OPTIMIZE_PARTS));
}


@@ -900,10 +897,7 @@ int ha_partition::analyze(THD *thd, HA_CHECK_OPT *check_opt)
{
  DBUG_ENTER("ha_partition::analyze");

  DBUG_RETURN(handle_opt_partitions(thd, check_opt, 
                                    ANALYZE_PARTS,
                                    thd->lex->alter_info.flags &
                                    ALTER_ANALYZE_PARTITION ? FALSE : TRUE));
  DBUG_RETURN(handle_opt_partitions(thd, check_opt, ANALYZE_PARTS));
}


@@ -924,10 +918,7 @@ int ha_partition::check(THD *thd, HA_CHECK_OPT *check_opt)
{
  DBUG_ENTER("ha_partition::check");

  DBUG_RETURN(handle_opt_partitions(thd, check_opt, 
                                    CHECK_PARTS,
                                    thd->lex->alter_info.flags &
                                    ALTER_CHECK_PARTITION ? FALSE : TRUE));
  DBUG_RETURN(handle_opt_partitions(thd, check_opt, CHECK_PARTS));
}


@@ -948,12 +939,10 @@ int ha_partition::repair(THD *thd, HA_CHECK_OPT *check_opt)
{
  DBUG_ENTER("ha_partition::repair");

  DBUG_RETURN(handle_opt_partitions(thd, check_opt, 
                                    REPAIR_PARTS,
                                    thd->lex->alter_info.flags &
                                    ALTER_REPAIR_PARTITION ? FALSE : TRUE));
  DBUG_RETURN(handle_opt_partitions(thd, check_opt, REPAIR_PARTS));
}


/*
  Handle optimize/analyze/check/repair of one partition

@@ -1056,7 +1045,6 @@ static bool print_admin_msg(THD* thd, const char* msg_type,
    thd                      Thread object
    check_opt                Options
    flag                     Optimize/Analyze/Check/Repair flag
    all_parts                All partitions or only a subset

  RETURN VALUE
    >0                        Failure
@@ -1064,7 +1052,7 @@ static bool print_admin_msg(THD* thd, const char* msg_type,
*/

int ha_partition::handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt,
                                        uint flag, bool all_parts)
                                        uint flag)
{
  List_iterator<partition_element> part_it(m_part_info->partitions);
  uint no_parts= m_part_info->no_parts;
@@ -1072,7 +1060,7 @@ int ha_partition::handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt,
  uint i= 0;
  int error;
  DBUG_ENTER("ha_partition::handle_opt_partitions");
  DBUG_PRINT("enter", ("all_parts %u, flag= %u", all_parts, flag));
  DBUG_PRINT("enter", ("flag= %u", flag));

  do
  {
@@ -1081,7 +1069,7 @@ int ha_partition::handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt,
      when ALTER TABLE <CMD> PARTITION ...
      it should only do named partitions, otherwise all partitions
    */
    if (all_parts ||
    if (!(thd->lex->alter_info.flags & ALTER_ADMIN_PARTITION) ||
        part_elem->part_state == PART_CHANGED)
    {
      if (m_is_sub_partitioned)
+1 −2
Original line number Diff line number Diff line
@@ -988,8 +988,7 @@ class ha_partition :public handler
    virtual bool is_crashed() const;

    private:
    int handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt,
                              uint flags, bool all_parts);
    int handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt, uint flags);
    public:
  /*
    -------------------------------------------------------------------------
+3 −6
Original line number Diff line number Diff line
@@ -842,15 +842,12 @@ inline bool st_select_lex_unit::is_union ()
#define ALTER_COALESCE_PARTITION (1L << 15)
#define ALTER_REORGANIZE_PARTITION (1L << 16) 
#define ALTER_PARTITION          (1L << 17)
#define ALTER_OPTIMIZE_PARTITION (1L << 18)
#define ALTER_ADMIN_PARTITION    (1L << 18)
#define ALTER_TABLE_REORG        (1L << 19)
#define ALTER_REBUILD_PARTITION  (1L << 20)
#define ALTER_ALL_PARTITION      (1L << 21)
#define ALTER_ANALYZE_PARTITION  (1L << 22)
#define ALTER_CHECK_PARTITION    (1L << 23)
#define ALTER_REPAIR_PARTITION   (1L << 24)
#define ALTER_REMOVE_PARTITIONING (1L << 25)
#define ALTER_FOREIGN_KEY         (1L << 26)
#define ALTER_REMOVE_PARTITIONING (1L << 22)
#define ALTER_FOREIGN_KEY        (1L << 23)

enum enum_alter_table_change_level
{
Loading