[Groonga-mysql-commit] mroonga/mroonga [master] [wrapper][update] support primary key update.

Back to archive index

null+****@clear***** null+****@clear*****
2011年 9月 28日 (水) 23:39:56 JST


Kouhei Sutou	2011-09-28 14:39:56 +0000 (Wed, 28 Sep 2011)

  New Revision: 18a3ef58e6e188bf7070d4583d77be2e24710745

  Log:
    [wrapper][update] support primary key update.

  Modified files:
    ha_mroonga.cc
    test/sql/groonga_wrapper/r/update.result
    test/sql/groonga_wrapper/t/update.test

  Modified: ha_mroonga.cc (+54 -7)
===================================================================
--- ha_mroonga.cc    2011-09-28 13:41:05 +0000 (d975782)
+++ ha_mroonga.cc    2011-09-28 14:39:56 +0000 (680d35c)
@@ -3423,10 +3423,41 @@ int ha_mroonga::wrapper_update_row_index(const uchar *old_data, uchar *new_data)
   MRN_DBUG_ENTER_METHOD();
 
   int error = 0;
-  grn_id record_id;
-  error = wrapper_get_record_id((uchar *)old_data, &record_id,
-                                "failed to get record ID "
+
+  KEY key_info = table->key_info[table_share->primary_key];
+  GRN_BULK_REWIND(&key_buffer);
+  key_copy((uchar *)(GRN_TEXT_VALUE(&key_buffer)),
+           new_data,
+           &key_info, key_info.key_length);
+  int added;
+  grn_id new_record_id;
+  new_record_id = grn_table_add(ctx, grn_table,
+                                GRN_TEXT_VALUE(&key_buffer),
+                                table->key_info->key_length,
+                                &added);
+  if (new_record_id == GRN_ID_NIL) {
+    char error_message[MRN_MESSAGE_BUFFER_SIZE];
+    snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE,
+             "failed to get new record ID for updating from groonga: key=<%.*s>",
+             (int)GRN_TEXT_LEN(&key_buffer), GRN_TEXT_VALUE(&key_buffer));
+    error = ER_ERROR_ON_WRITE;
+    my_message(error, error_message, MYF(0));
+    DBUG_RETURN(error);
+  }
+
+  grn_id old_record_id;
+  my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(old_data, table->record[0]);
+  for (int j = 0; j < key_info.key_parts; j++) {
+    Field *field = key_info.key_part[j].field;
+    field->move_field_offset(ptr_diff);
+  }
+  error = wrapper_get_record_id((uchar *)old_data, &old_record_id,
+                                "failed to get old record ID "
                                 "for updating from groonga");
+  for (int j = 0; j < key_info.key_parts; j++) {
+    Field *field = key_info.key_part[j].field;
+    field->move_field_offset(-ptr_diff);
+  }
   if (error) {
     DBUG_RETURN(error);
   }
@@ -3435,8 +3466,6 @@ int ha_mroonga::wrapper_update_row_index(const uchar *old_data, uchar *new_data)
   GRN_TEXT_INIT(&old_value, 0);
   GRN_TEXT_INIT(&new_value, 0);
 
-  my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(old_data, table->record[0]);
-
 #ifndef DBUG_OFF
   my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table, table->read_set);
 #endif
@@ -3464,8 +3493,20 @@ int ha_mroonga::wrapper_update_row_index(const uchar *old_data, uchar *new_data)
       field->move_field_offset(-ptr_diff);
 
       grn_rc rc;
-      rc = grn_column_index_update(ctx, index_column, record_id, j + 1,
-                                   &old_value, &new_value);
+      if (old_record_id == new_record_id) {
+        rc = grn_column_index_update(ctx, index_column, old_record_id, j + 1,
+                                     &old_value, &new_value);
+      } else {
+        rc = grn_column_index_update(ctx, index_column, old_record_id, j + 1,
+                                     &old_value, NULL);
+        if (!rc) {
+          rc = grn_column_index_update(ctx, index_column, new_record_id, j + 1,
+                                       NULL, &new_value);
+        }
+        if (!rc) {
+          rc = grn_table_delete_by_id(ctx, grn_table, old_record_id);
+        }
+      }
       if (rc) {
         error = ER_ERROR_ON_WRITE;
         my_message(error, ctx->errbuf, MYF(0));
@@ -3769,6 +3810,12 @@ err:
 #endif
   grn_obj_unlink(ctx, &old_value);
 
+  grn_table_delete_by_id(ctx, grn_table, record_id);
+  if (ctx->rc) {
+    error = ER_ERROR_ON_WRITE;
+    my_message(error, ctx->errbuf, MYF(0));
+  }
+
   DBUG_RETURN(error);
 }
 

  Modified: test/sql/groonga_wrapper/r/update.result (+11 -0)
===================================================================
--- test/sql/groonga_wrapper/r/update.result    2011-09-28 13:41:05 +0000 (f39280e)
+++ test/sql/groonga_wrapper/r/update.result    2011-09-28 14:39:56 +0000 (c89c641)
@@ -54,4 +54,15 @@ c1	c2
 20	ta ti tu te
 select * from t1 where match(c2) against("ki");
 c1	c2
+update t1 set c1=40 where c1=20;
+select * from t1;
+c1	c2
+10	aa ii uu ee
+30	sa si su se
+40	ta ti tu te
+select * from t1 where match(c2) against("ti");
+c1	c2
+40	ta ti tu te
+select * from t1 where match(c2) against("ki");
+c1	c2
 drop table t1;

  Modified: test/sql/groonga_wrapper/t/update.test (+5 -0)
===================================================================
--- test/sql/groonga_wrapper/t/update.test    2011-09-28 13:41:05 +0000 (e3c9470)
+++ test/sql/groonga_wrapper/t/update.test    2011-09-28 14:39:56 +0000 (d57790c)
@@ -48,6 +48,11 @@ select * from t1;
 select * from t1 where match(c2) against("ti");
 select * from t1 where match(c2) against("ki");
 
+update t1 set c1=40 where c1=20;
+select * from t1;
+select * from t1 where match(c2) against("ti");
+select * from t1 where match(c2) against("ki");
+
 drop table t1;
 
 --source suite/groonga_include/groonga_deinit.inc




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