List:Internals« Previous MessageNext Message »
From:mikael Date:September 2 2005 5:40pm
Subject:bk commit into 5.1 tree (mronstrom:1.1898)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of mikron. When mikron does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.1898 05/09/02 19:40:40 mronstrom@stripped +8 -0
  WL 2602,2603,2604: Partition Management

  sql/sql_yacc.yy
    1.404 05/09/02 19:40:23 mronstrom@stripped +30 -0
    Added part_state to generate_partition_syntax

  sql/sql_table.cc
    1.269 05/09/02 19:40:23 mronstrom@stripped +42 -42
    Added part_state to generate_partition_syntax

  sql/sql_show.cc
    1.258 05/09/02 19:40:22 mronstrom@stripped +1 -1
    Added part_state to generate_partition_syntax

  sql/sql_partition.cc
    1.4 05/09/02 19:40:22 mronstrom@stripped +64 -29
    Added part_state to generate_partition_syntax

  sql/lex.h
    1.141 05/09/02 19:40:21 mronstrom@stripped +1 -0
    Added part_state to generate_partition_syntax

  sql/handler.h
    1.157 05/09/02 19:40:21 mronstrom@stripped +4 -2
    Added part_state to generate_partition_syntax

  sql/ha_partition.h
    1.4 05/09/02 19:40:21 mronstrom@stripped +6 -5
    Add add_partitions

  sql/ha_partition.cc
    1.5 05/09/02 19:40:21 mronstrom@stripped +51 -0
    Add add_partitions

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	mronstrom
# Host:	c-8a0ae253.1238-1-64736c10.cust.bredbandsbolaget.se
# Root:	/Users/mikron/wl2602

--- 1.156/sql/handler.h	2005-09-02 15:57:09 +02:00
+++ 1.157/sql/handler.h	2005-09-02 19:40:21 +02:00
@@ -408,7 +408,8 @@
   PART_NORMAL= 0,
   PART_IS_DROPPED= 1,
   PART_TO_BE_DROPPED= 2,
-  PART_DROPPING= 3,
+  PART_TO_BE_ADDED= 3,
+  PART_TO_BE_REORGED= 4,
   PART_IS_ADDED= 4,
   PART_IS_ADDING= 5,
   PART_ADDED= 6
@@ -669,7 +670,8 @@
                           handler *file, ulonglong max_rows);
 bool fix_partition_func(THD *thd, const char *name, TABLE *table);
 char *generate_partition_syntax(partition_info *part_info,
-                                uint *buf_length, bool use_sql_alloc);
+                                uint *buf_length, bool use_sql_alloc,
+                                bool write_part_state);
 bool partition_key_modified(TABLE *table, List<Item> &fields);
 void get_partition_set(const TABLE *table, byte *buf, const uint index,
                        const key_range *key_spec,

--- 1.140/sql/lex.h	2005-08-19 16:25:28 +02:00
+++ 1.141/sql/lex.h	2005-09-02 19:40:21 +02:00
@@ -375,6 +375,7 @@
   { "PARTITION",        SYM(PARTITION_SYM)},
 #endif
   { "PARTITIONS",       SYM(PARTITIONS_SYM)},
+  { "PART_STATE",       SYM(PART_STATE_SYM)},
   { "PASSWORD",		SYM(PASSWORD)},
   { "PHASE",            SYM(PHASE_SYM)},
   { "POINT",		SYM(POINT_SYM)},

--- 1.257/sql/sql_show.cc	2005-08-05 23:50:38 +02:00
+++ 1.258/sql/sql_show.cc	2005-09-02 19:40:22 +02:00
@@ -1050,7 +1050,7 @@
     if (table->s->part_info &&
         ((part_syntax= generate_partition_syntax(table->s->part_info,
                                                   &part_syntax_len,
-                                                  FALSE))))
+                                                  FALSE, FALSE))))
     {
        packet->append(part_syntax, part_syntax_len);
        my_free(part_syntax, MYF(0));

--- 1.268/sql/sql_table.cc	2005-09-02 15:57:11 +02:00
+++ 1.269/sql/sql_table.cc	2005-09-02 19:40:23 +02:00
@@ -146,7 +146,7 @@
   }
   if (!(part_syntax_buf= generate_partition_syntax(part_info,
                                                    &syntax_len,
-                                                   TRUE)))
+                                                   TRUE, TRUE)))
   {
     DBUG_RETURN(TRUE);
   }
@@ -1729,7 +1729,7 @@
     */
     if (!(part_syntax_buf= generate_partition_syntax(part_info,
                                                      &syntax_len,
-                                                     TRUE)))
+                                                     TRUE, FALSE)))
       DBUG_RETURN(TRUE);
     part_info->part_info_string= part_syntax_buf;
     part_info->part_info_len= syntax_len;
@@ -4300,18 +4300,18 @@
   {
     /* Set-up struct used to write frm files */
     partition_info *part_info= table->s->part_info;
-    write_frm_type wft_obj;
-    write_frm_type *wft= &wft_obj;
-    wft->thd= thd;
-    wft->create_info= create_info;
-    wft->create_list= &create_list;
-    wft->key_list= &key_list;
-    wft->db_options= 0;
-    wft->table= table;
-    wft->key_info_buffer= 0;
-    wft->key_count= 0;
-    wft->db= db;
-    wft->table_name= table_name;
+    LOCK_PARAM_TYPE lpt_obj;
+    LOCK_PARAM_TYPE *lpt= &lpt_obj;
+    lpt->thd= thd;
+    lpt->create_info= create_info;
+    lpt->create_list= &create_list;
+    lpt->key_list= &key_list;
+    lpt->db_options= 0;
+    lpt->table= table;
+    lpt->key_info_buffer= 0;
+    lpt->key_count= 0;
+    lpt->db= db;
+    lpt->table_name= table_name;
     thd->lex->part_info= part_info;
     if (online_drop_partition)
     {
@@ -4345,12 +4345,12 @@
            remaining locks).
       */
 
-      if ((abort_and_upgrade_lock(wft)) ||
-          (mysql_write_frm(wft, TRUE, FALSE)) ||
-          (close_open_tables_and_downgrade(wft), FALSE) || 
-          (mysql_drop_partitions(wft)) ||
-          (mysql_write_frm(wft, FALSE, TRUE)) ||
-          (mysql_wait_completed_table(wft, table), FALSE))
+      if ((abort_and_upgrade_lock(lpt)) ||
+          (mysql_write_frm(lpt, TRUE, FALSE)) ||
+          (close_open_tables_and_downgrade(lpt), FALSE) || 
+          (mysql_drop_partitions(lpt)) ||
+          (mysql_write_frm(lpt, FALSE, TRUE)) ||
+          (mysql_wait_completed_table(lpt, table), FALSE))
       {
         DBUG_RETURN(TRUE);
       }
@@ -4387,13 +4387,13 @@
            remaining locks).
       */
       if (table->reginfo.lock_type == TL_WRITE_ALLOW_READ)
-        mysql_lock_downgrade_write(wft->thd, wft->table,
+        mysql_lock_downgrade_write(lpt->thd, lpt->table,
                                    TL_WRITE_ALLOW_WRITE);
-      if ((mysql_write_frm(wft, TRUE, FALSE)) ||
-          (mysql_add_partitions(wft)) ||
-          (abort_and_upgrade_lock(wft)) ||
-          (mysql_write_frm(wft, FALSE, TRUE)) ||
-          (close_open_tables_and_downgrade(wft), FALSE))
+      if ((mysql_write_frm(lpt, TRUE, FALSE)) ||
+          (mysql_add_partitions(lpt)) ||
+          (abort_and_upgrade_lock(lpt)) ||
+          (mysql_write_frm(lpt, FALSE, TRUE)) ||
+          (close_open_tables_and_downgrade(lpt), FALSE))
       {
         DBUG_RETURN(TRUE);
       }
@@ -4452,31 +4452,31 @@
       if (table->file->alter_table_flags() & HA_ONLINE_DOUBLE_WRITE)
       {
         if (table->reginfo.lock_type == TL_WRITE_ALLOW_READ)
-          mysql_lock_downgrade_write(wft->thd, wft->table,
+          mysql_lock_downgrade_write(lpt->thd, lpt->table,
                                      TL_WRITE_ALLOW_WRITE);
-        if ((mysql_write_frm(wft, TRUE, FALSE)) ||
-            (mysql_add_partitions(wft)) ||
+        if ((mysql_write_frm(lpt, TRUE, FALSE)) ||
+            (mysql_add_partitions(lpt)) ||
             (table->file->copy_partitions()) ||
-            (mysql_write_frm(wft, FALSE, TRUE)) ||
-            (mysql_wait_completed_table(wft, table), FALSE) ||
-            (mysql_drop_partitions(wft)) ||
-            (mysql_write_frm(wft, FALSE, FALSE)) ||
-            (mysql_wait_completed_table(wft, table), FALSE))
+            (mysql_write_frm(lpt, FALSE, TRUE)) ||
+            (mysql_wait_completed_table(lpt, table), FALSE) ||
+            (mysql_drop_partitions(lpt)) ||
+            (mysql_write_frm(lpt, FALSE, FALSE)) ||
+            (mysql_wait_completed_table(lpt, table), FALSE))
         {
           DBUG_RETURN(TRUE);
         }
       }
       else
       {
-        if ((mysql_write_frm(wft, TRUE, FALSE)) ||
-            (mysql_add_partitions(wft)) ||
+        if ((mysql_write_frm(lpt, TRUE, FALSE)) ||
+            (mysql_add_partitions(lpt)) ||
             (table->file->copy_partitions()) ||
-            (abort_and_upgrade_lock(wft)) ||
-            (mysql_write_frm(wft, FALSE, TRUE)) ||
-            (mysql_rename_partitions(wft)) ||
-            (close_open_tables_and_downgrade(wft), FALSE) ||
-            (mysql_drop_partitions(wft)) ||
-            (mysql_write_frm(wft, FALSE, FALSE)))
+            (abort_and_upgrade_lock(lpt)) ||
+            (mysql_write_frm(lpt, FALSE, TRUE)) ||
+            (mysql_rename_partitions(lpt)) ||
+            (close_open_tables_and_downgrade(lpt), FALSE) ||
+            (mysql_drop_partitions(lpt)) ||
+            (mysql_write_frm(lpt, FALSE, FALSE)))
         {
           DBUG_RETURN(TRUE);
         }

--- 1.403/sql/sql_yacc.yy	2005-08-19 16:25:28 +02:00
+++ 1.404/sql/sql_yacc.yy	2005-09-02 19:40:23 +02:00
@@ -472,6 +472,7 @@
 %token  PARTIAL
 %token  PARTITION_SYM
 %token  PARTITIONS_SYM
+%token  PART_STATE_SYM
 %token  PASSWORD
 %token  PARAM_MARKER
 %token  PHASE_SYM
@@ -2840,6 +2841,7 @@
           part_info->count_curr_parts++;
         }
         part_name {}
+        opt_part_state {}
         opt_part_values {}
         opt_part_options {}
         opt_sub_partition {}
@@ -2850,6 +2852,33 @@
         { Lex->part_info->curr_part_elem->partition_name= $1.str; }
         ;
 
+opt_part_state:
+        /* empty */
+        { Lex->part_info->curr_part_elem->part_state= PART_NORMAL; }
+        | PART_STATE_SYM opt_equal ident_or_text
+        {
+          char *part_state= $3.str;
+          if (strcmp(part_state, "PART_TO_BE_DROPPED"))
+          {
+            ;
+          } else if (strcmp(part_state, "PART_TO_BE_ADDED"))
+          {
+            ;
+          } else if (strcmp(part_state, "PART_IS_ADDING"))
+          {
+            ;
+          }
+          else if (strcmp(part_state, "PART_TO_BE_REORGED"))
+          {
+            ;
+          }
+          else
+          {
+            YYABORT;
+          }
+        }
+        ;
+        
 opt_part_values:
         /* empty */
         {
@@ -8127,6 +8156,7 @@
 	| PACK_KEYS_SYM		{}
 	| PARTIAL		{}
 	| PARTITIONS_SYM	{}
+	| PART_STATE_SYM	{}
 	| PASSWORD		{}
         | PHASE_SYM             {}
 	| POINT_SYM		{}

--- 1.4/sql/ha_partition.cc	2005-08-22 17:56:49 +02:00
+++ 1.5/sql/ha_partition.cc	2005-09-02 19:40:21 +02:00
@@ -390,6 +390,8 @@
   DBUG_RETURN(0);
 }
 
+
+
 int ha_partition::drop_partitions(const char *path)
 {
   List_iterator<partition_element> part_it(m_part_info->partitions);
@@ -430,6 +432,55 @@
         error= m_file[i]->delete_table((const char *) part_name_buff);
       }
       part_elem->part_state= PART_IS_DROPPED;
+    }
+  } while (++i < no_parts);
+  DBUG_RETURN(error);
+}
+
+
+int ha_partition::add_partitions(HA_CREATE_INFO *create_info,
+                                 const char *path)
+{
+  List_iterator<partition_element> part_it(m_part_info->partitions);
+  char part_name_buff[FN_REFLEN];
+  uint no_parts= m_part_info->no_parts;
+  uint no_subparts= m_part_info->no_subparts, i= 0;
+  int error= 1;
+  DBUG_ENTER("ha_partition::add_partitions()");
+
+  do
+  {
+    partition_element *part_elem= part_it++;
+    if (part_elem->part_state == PART_TO_BE_ADDED)
+    {
+      /*
+        This part is to be dropped, meaning the part or all its subparts.
+      */
+      if (is_sub_partitioned(m_part_info))
+      {
+        List_iterator<partition_element> sub_it(part_elem->subpartitions);
+        uint j= 0, part;
+        do
+        {
+          partition_element *sub_elem= sub_it++;
+          create_subpartition_name(part_name_buff, path,
+                                   part_elem->partition_name,
+                                   sub_elem->partition_name);
+          part= i * no_subparts + j;
+          DBUG_PRINT("info", ("Add subpartition %s", part_name_buff));
+          error= m_file[part]->create((const char *) part_name_buff,
+                                      table, create_info);
+        } while (++j < no_subparts);
+      }
+      else
+      {
+        create_partition_name(part_name_buff, path,
+                              part_elem->partition_name);
+        DBUG_PRINT("info", ("Add partition %s", part_name_buff));
+        error= m_file[i]->create((const char *) part_name_buff,
+                                 table, create_info);
+      }
+      part_elem->part_state= PART_NORMAL;
     }
   } while (++i < no_parts);
   DBUG_RETURN(error);

--- 1.3/sql/ha_partition.h	2005-08-22 17:56:50 +02:00
+++ 1.4/sql/ha_partition.h	2005-09-02 19:40:21 +02:00
@@ -161,11 +161,12 @@
   */
   virtual int delete_table(const char *from);
   virtual int rename_table(const char *from, const char *to);
-  virtual int create(const char *name, TABLE * form,
-		     HA_CREATE_INFO * create_info);
+  virtual int create(const char *name, TABLE *form,
+		     HA_CREATE_INFO *create_info);
   virtual int create_handler_files(const char *name);
-  virtual void update_create_info(HA_CREATE_INFO * create_info);
+  virtual void update_create_info(HA_CREATE_INFO *create_info);
   virtual char *update_table_comment(const char *comment);
+  virtual int add_partitions(HA_CREATE_INFO *create_info, const char *path);
   virtual int drop_partitions(const char *path);
 private:
   /*
@@ -174,8 +175,8 @@
   */
     uint del_ren_cre_table(const char *from,
 			   const char *to= NULL,
-			   TABLE * table_arg= NULL,
-			   HA_CREATE_INFO * create_info= NULL);
+			   TABLE *table_arg= NULL,
+			   HA_CREATE_INFO *create_info= NULL);
   /*
     One method to create the table_name.par file containing the names of the
     underlying partitions, their engine and the number of partitions.

--- 1.3/sql/sql_partition.cc	2005-08-19 16:25:28 +02:00
+++ 1.4/sql/sql_partition.cc	2005-09-02 19:40:22 +02:00
@@ -1886,6 +1886,33 @@
   return err;
 }
 
+static int add_part_state_string(File fptr)
+{
+  return add_string(fptr, "PART_STATE = ");
+}
+  
+static int add_partition_state(File fptr, partition_element *p_elem)
+{
+  int err= 0;
+  switch (p_elem->part_state)
+  {
+    case PART_TO_BE_DROPPED:
+      err+= add_part_state_string(fptr);
+      err+= add_string(fptr, "PART_TO_BE_DROPPED");
+      break;
+    case PART_TO_BE_ADDED:
+      err+= add_part_state_string(fptr);
+      err+= add_string(fptr, "PART_TO_BE_ADDED");
+      break;
+    case PART_IS_DROPPED:
+    case PART_NORMAL:
+      break;
+    default:
+      break;
+  }
+  return err;
+}
+
 static int add_partition_options(File fptr, partition_element *p_elem)
 {
   int err= 0;
@@ -1952,6 +1979,8 @@
     buf_length                 A pointer to the returned buffer length
     use_sql_alloc              Allocate buffer from sql_alloc if true
                                otherwise use my_malloc
+    write_part_state           Is partition state to be written as part of
+                               the syntax
   RETURN VALUES
     NULL error
     buf, buf_length            Buffer and its length
@@ -1977,7 +2006,8 @@
 
 char *generate_partition_syntax(partition_info *part_info,
                                 uint *buf_length,
-                                bool use_sql_alloc)
+                                bool use_sql_alloc,
+                                bool write_part_state)
 {
   uint i,j, no_parts, no_subparts;
   partition_element *part_elem;
@@ -2050,41 +2080,46 @@
   do
   {
     part_elem= part_it++;
-    err+= add_partition(fptr);
-    err+= add_string(fptr, part_elem->partition_name);
-    err+= add_space(fptr);
-    err+= add_partition_values(fptr, part_info, part_elem);
-    if (!is_sub_partitioned(part_info))
-      err+= add_partition_options(fptr, part_elem);
-    if (is_sub_partitioned(part_info))
+    if (part_elem->part_state != PART_IS_DROPPED)
     {
+      err+= add_partition(fptr);
+      err+= add_string(fptr, part_elem->partition_name);
       err+= add_space(fptr);
-      err+= add_begin_parenthesis(fptr);
-      List_iterator<partition_element> sub_it(part_elem->subpartitions);
-      j= 0;
-      do
+      if (write_part_state)
+        err+= add_partition_state(fptr, part_elem);
+      err+= add_partition_values(fptr, part_info, part_elem);
+      if (!is_sub_partitioned(part_info))
+        err+= add_partition_options(fptr, part_elem);
+      if (is_sub_partitioned(part_info))
       {
-        part_elem= sub_it++;
-        err+= add_subpartition(fptr);
-        err+= add_string(fptr, part_elem->partition_name);
         err+= add_space(fptr);
-        err+= add_partition_options(fptr, part_elem);
-        if (j != (no_subparts-1))
+        err+= add_begin_parenthesis(fptr);
+        List_iterator<partition_element> sub_it(part_elem->subpartitions);
+        j= 0;
+        do
         {
-          err+= add_comma(fptr);
+          part_elem= sub_it++;
+          err+= add_subpartition(fptr);
+          err+= add_string(fptr, part_elem->partition_name);
           err+= add_space(fptr);
-        }
-        else
-          err+= add_end_parenthesis(fptr);
-      } while (++j < no_subparts);
-    }
-    if (i != (no_parts-1))
-    {
-      err+= add_comma(fptr);
-      err+= add_space(fptr);
+          err+= add_partition_options(fptr, part_elem);
+          if (j != (no_subparts-1))
+          {
+            err+= add_comma(fptr);
+            err+= add_space(fptr);
+          }
+          else
+            err+= add_end_parenthesis(fptr);
+        } while (++j < no_subparts);
+      }
+      if (i != (no_parts-1))
+      {
+        err+= add_comma(fptr);
+        err+= add_space(fptr);
+      }
+      else
+        err+= add_end_parenthesis(fptr);
     }
-    else
-      err+= add_end_parenthesis(fptr);
   } while (++i < no_parts);
   if (err)
     goto close_file;
Thread
bk commit into 5.1 tree (mronstrom:1.1898)mikael5 Sep