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