[Groonga-mysql-commit] mroonga/mroonga [master] fix error for alter table for MariaDB 5.3 and MySQL 5.1

Back to archive index

null+****@clear***** null+****@clear*****
2011年 11月 27日 (日) 21:06:09 JST


Kentoku	2011-11-27 12:06:09 +0000 (Sun, 27 Nov 2011)

  New Revision: 2f92031610226a7ce97bfd87ccb4db3297e8d7bf

  Log:
    fix error for alter table for MariaDB 5.3 and MySQL 5.1

  Modified files:
    ha_mroonga.cc
    ha_mroonga.h

  Modified: ha_mroonga.cc (+87 -8)
===================================================================
--- ha_mroonga.cc    2011-11-27 09:50:40 +0000 (b0a382d)
+++ ha_mroonga.cc    2011-11-27 12:06:09 +0000 (9ffaa0d)
@@ -1290,8 +1290,8 @@ static _ft_vft mrn_no_such_key_ft_vft = {
 };
 
 /* handler implementation */
-ha_mroonga::ha_mroonga(handlerton *hton, TABLE_SHARE *share)
-  :handler(hton, share),
+ha_mroonga::ha_mroonga(handlerton *hton, TABLE_SHARE *share_arg)
+  :handler(hton, share_arg),
    ignoring_duplicated_key(false),
    ignoring_no_key_columns(false)
 {
@@ -2052,10 +2052,13 @@ int ha_mroonga::storage_create_indexes(TABLE *table, const char *grn_table_name,
     }
   }
   if (error) {
-    for (; i >= 0; i--) {
+    while (TRUE) {
       if (index_tables[i]) {
         grn_obj_remove(ctx, index_tables[i]);
       }
+      if (!i)
+        break;
+      i--;
     }
   }
 
@@ -2367,7 +2370,7 @@ int ha_mroonga::wrapper_open_indexes(const char *name)
 
 error:
   if (error) {
-    for (; i >= 0; i--) {
+    while (TRUE) {
       if (key_min[i]) {
         free(key_min[i]);
       }
@@ -2382,6 +2385,9 @@ error:
       if (index_table) {
         grn_obj_unlink(ctx, index_table);
       }
+      if (!i)
+        break;
+      i--;
     }
     free(key_min);
     free(key_max);
@@ -2546,7 +2552,7 @@ int ha_mroonga::storage_open_indexes(const char *name)
 
 error:
   if (error) {
-    for (; i >= 0; i--) {
+    while (TRUE) {
       if (key_min[i]) {
         free(key_min[i]);
       }
@@ -2561,6 +2567,9 @@ error:
       if (index_table) {
         grn_obj_unlink(ctx, index_table);
       }
+      if (!i)
+        break;
+      i--;
     }
     free(key_min);
     free(key_max);
@@ -7768,6 +7777,10 @@ uint ha_mroonga::alter_table_flags(uint flags)
 #ifdef MRN_HANDLER_HAVE_ADD_INDEX
 int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info,
                                   uint num_of_keys, handler_add_index **add)
+#else
+int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info,
+                                  uint num_of_keys)
+#endif
 {
   int res = 0;
   uint i, j, k;
@@ -7801,7 +7814,9 @@ int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info,
              (const uchar *) share->table_name,
              (const uchar *) share->table_name + share->table_name_length);
   mrn_table_name_gen(decode_name, grn_table_name);
+#ifdef MRN_HANDLER_HAVE_ADD_INDEX
   hnd_add_index = NULL;
+#endif
   bitmap_clear_all(table->read_set);
   mrn_set_bitmap_by_key(table->read_set, p_key_info);
   for (i = 0, j = 0; i < num_of_keys; i++) {
@@ -7910,7 +7925,11 @@ int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info,
   {
     MRN_SET_WRAP_SHARE_KEY(share, table->s);
     MRN_SET_WRAP_TABLE_KEY(this, table);
+#ifdef MRN_HANDLER_HAVE_ADD_INDEX
     res = wrap_handler->add_index(table_arg, wrap_key_info, j, &hnd_add_index);
+#else
+    res = wrap_handler->add_index(table_arg, wrap_key_info, j);
+#endif
     MRN_SET_BASE_SHARE_KEY(share, table->s);
     MRN_SET_BASE_TABLE_KEY(this, table);
   }
@@ -7926,16 +7945,24 @@ int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info,
         grn_obj_remove(ctx, index_tables[k + n_keys]);
       }
     }
-  } else {
+  }
+#ifdef MRN_HANDLER_HAVE_ADD_INDEX
+  else {
     *add = new handler_add_index(table_arg, key_info, num_of_keys);
   }
+#endif
   mrn_free_share_alloc(tmp_share);
   my_free(tmp_share, MYF(0));
   DBUG_RETURN(res);
 }
 
+#ifdef MRN_HANDLER_HAVE_ADD_INDEX
 int ha_mroonga::storage_add_index(TABLE *table_arg, KEY *key_info,
                                   uint num_of_keys, handler_add_index **add)
+#else
+int ha_mroonga::storage_add_index(TABLE *table_arg, KEY *key_info,
+                                  uint num_of_keys)
+#endif
 {
   int res = 0;
   uint i, j, k;
@@ -8006,9 +8033,12 @@ int ha_mroonga::storage_add_index(TABLE *table_arg, KEY *key_info,
         grn_obj_remove(ctx, index_tables[k + n_keys]);
       }
     }
-  } else {
+  }
+#ifdef MRN_HANDLER_HAVE_ADD_INDEX
+  else {
     *add = new handler_add_index(table_arg, key_info, num_of_keys);
   }
+#endif
   mrn_free_share_alloc(tmp_share);
   my_free(tmp_share, MYF(0));
   DBUG_RETURN(res);
@@ -8067,6 +8097,7 @@ int ha_mroonga::storage_add_index_multiple_columns(KEY *key_info,
   DBUG_RETURN(error);
 }
 
+#ifdef MRN_HANDLER_HAVE_ADD_INDEX
 int ha_mroonga::add_index(TABLE *table_arg, KEY *key_info,
                           uint num_of_keys, handler_add_index **add)
 {
@@ -8080,7 +8111,23 @@ int ha_mroonga::add_index(TABLE *table_arg, KEY *key_info,
   }
   DBUG_RETURN(res);
 }
+#else
+int ha_mroonga::add_index(TABLE *table_arg, KEY *key_info,
+                          uint num_of_keys)
+{
+  MRN_DBUG_ENTER_METHOD();
+  int res;
+  if (share->wrapper_mode)
+  {
+    res = wrapper_add_index(table_arg, key_info, num_of_keys);
+  } else {
+    res = storage_add_index(table_arg, key_info, num_of_keys);
+  }
+  DBUG_RETURN(res);
+}
+#endif
 
+#ifdef MRN_HANDLER_HAVE_ADD_INDEX
 int ha_mroonga::wrapper_final_add_index(handler_add_index *add, bool commit)
 {
   int res = 0;
@@ -8122,6 +8169,7 @@ int ha_mroonga::final_add_index(handler_add_index *add, bool commit)
   }
   DBUG_RETURN(res);
 }
+#endif
 
 int ha_mroonga::wrapper_prepare_drop_index(TABLE *table_arg, uint *key_num,
   uint num_of_keys)
@@ -8234,7 +8282,6 @@ int ha_mroonga::final_drop_index(TABLE *table_arg)
   }
   DBUG_RETURN(res);
 }
-#endif
 
 int ha_mroonga::wrapper_update_auto_increment()
 {
@@ -8478,6 +8525,38 @@ int ha_mroonga::start_stmt(THD *thd, thr_lock_type lock_type)
   DBUG_RETURN(res);
 }
 
+void ha_mroonga::wrapper_change_table_ptr(TABLE *table_arg,
+                                          TABLE_SHARE *share_arg)
+{
+  MRN_DBUG_ENTER_METHOD();
+  MRN_SET_WRAP_SHARE_KEY(share, table->s);
+  MRN_SET_WRAP_TABLE_KEY(this, table);
+  wrap_handler->change_table_ptr(table_arg, share->wrap_table_share);
+  MRN_SET_BASE_SHARE_KEY(share, table->s);
+  MRN_SET_BASE_TABLE_KEY(this, table);
+  DBUG_VOID_RETURN;
+}
+
+void ha_mroonga::storage_change_table_ptr(TABLE *table_arg,
+                                          TABLE_SHARE *share_arg)
+{
+  MRN_DBUG_ENTER_METHOD();
+  DBUG_VOID_RETURN;
+}
+
+void ha_mroonga::change_table_ptr(TABLE *table_arg, TABLE_SHARE *share_arg)
+{
+  MRN_DBUG_ENTER_METHOD();
+  handler::change_table_ptr(table_arg, share_arg);
+  if (share && share->wrapper_mode)
+  {
+    wrapper_change_table_ptr(table_arg, share_arg);
+  } else {
+    storage_change_table_ptr(table_arg, share_arg);
+  }
+  DBUG_VOID_RETURN;
+}
+
 #ifdef __cplusplus
 }
 #endif

  Modified: ha_mroonga.h (+13 -3)
===================================================================
--- ha_mroonga.h    2011-11-27 09:50:40 +0000 (e3c0fed)
+++ ha_mroonga.h    2011-11-27 12:06:09 +0000 (c506763)
@@ -171,7 +171,7 @@ private:
   bool ignoring_no_key_columns;
 
 public:
-  ha_mroonga(handlerton *hton, TABLE_SHARE *share);
+  ha_mroonga(handlerton *hton, TABLE_SHARE *share_arg);
   ~ha_mroonga();
   const char *table_type() const;           // required
   const char *index_type(uint inx);
@@ -315,9 +315,11 @@ public:
   int add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys,
                 handler_add_index **add);
   int final_add_index(handler_add_index *add, bool commit);
+#else
+  int add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys);
+#endif
   int prepare_drop_index(TABLE *table_arg, uint *key_num, uint num_of_keys);
   int final_drop_index(TABLE *table_arg);
-#endif
   int update_auto_increment();
   void set_next_insert_id(ulonglong id);
   void get_auto_increment(ulonglong offset, ulonglong increment, ulonglong nb_desired_values,
@@ -351,6 +353,7 @@ protected:
 #ifdef MRN_HANDLER_HAVE_HA_INDEX_LAST
   int index_last(uchar *buf);
 #endif
+  void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share_arg);
 
 private:
   void push_warning_unsupported_spatial_index_search(enum ha_rkey_function flag);
@@ -649,17 +652,22 @@ private:
                         handler_add_index **add);
   int storage_add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys,
                         handler_add_index **add);
+#else
+  int wrapper_add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys);
+  int storage_add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys);
+#endif
   int storage_add_index_multiple_columns(KEY *key_info, uint num_of_keys,
                                          grn_obj **index_columns);
+#ifdef MRN_HANDLER_HAVE_ADD_INDEX
   int wrapper_final_add_index(handler_add_index *add, bool commit);
   int storage_final_add_index(handler_add_index *add, bool commit);
+#endif
   int wrapper_prepare_drop_index(TABLE *table_arg, uint *key_num,
                                  uint num_of_keys);
   int storage_prepare_drop_index(TABLE *table_arg, uint *key_num,
                                  uint num_of_keys);
   int wrapper_final_drop_index(TABLE *table_arg);
   int storage_final_drop_index(TABLE *table_arg);
-#endif
   int wrapper_update_auto_increment();
   int storage_update_auto_increment();
   void wrapper_set_next_insert_id(ulonglong id);
@@ -680,6 +688,8 @@ private:
   int storage_reset_auto_increment(ulonglong value);
   int wrapper_start_stmt(THD *thd, thr_lock_type lock_type);
   int storage_start_stmt(THD *thd, thr_lock_type lock_type);
+  void wrapper_change_table_ptr(TABLE *table_arg, TABLE_SHARE *share_arg);
+  void storage_change_table_ptr(TABLE *table_arg, TABLE_SHARE *share_arg);
 };
 
 #ifdef __cplusplus




Groonga-mysql-commit メーリングリストの案内
Back to archive index