[Groonga-mysql-commit] mroonga/mroonga [master] support auto_increment with blob field. fixes #1072

アーカイブの一覧に戻る

null+****@clear***** null+****@clear*****
2011年 9月 11日 (日) 12:45:44 JST


Kouhei Sutou	2011-09-11 03:45:44 +0000 (Sun, 11 Sep 2011)

  New Revision: 1cdb886e9fc1dd7ca7e02e1e7731afbd1164508f

  Log:
    support auto_increment with blob field. fixes #1072
    
    support HA_EXTRA_KEYREAD.
    
    Reported by @zaubermaerchen. Thanks!!!

  Modified files:
    ha_mroonga.cc
    ha_mroonga.h

  Modified: ha_mroonga.cc (+27 -3)
===================================================================
--- ha_mroonga.cc    2011-09-11 03:44:11 +0000 (7d97e31)
+++ ha_mroonga.cc    2011-09-11 03:45:44 +0000 (71e183c)
@@ -970,7 +970,8 @@ static _ft_vft mrn_storage_ft_vft = {
 /* handler implementation */
 ha_mroonga::ha_mroonga(handlerton *hton, TABLE_SHARE *share)
   :handler(hton, share),
-   ignoring_duplicated_key(false)
+   ignoring_duplicated_key(false),
+   ignoring_no_key_columns(false)
 {
   MRN_DBUG_ENTER_METHOD();
   ctx = grn_ctx_open(0);
@@ -2651,6 +2652,12 @@ int ha_mroonga::mrn_extra(enum ha_extra_function operation)
   case HA_EXTRA_NO_IGNORE_DUP_KEY:
     ignoring_duplicated_key = false;
     break;
+  case HA_EXTRA_KEYREAD:
+    ignoring_no_key_columns = true;
+    break;
+  case HA_EXTRA_NO_KEYREAD:
+    ignoring_no_key_columns = false;
+    break;
   default:
     break;
   }
@@ -4858,6 +4865,22 @@ void ha_mroonga::store_fields_from_primary_table(uchar *buf, grn_id record_id)
     const char *col_name = field->field_name;
     int col_name_size = strlen(col_name);
 
+    bool need_store_field = true;
+    if (ignoring_no_key_columns) {
+      need_store_field = false;
+      uint n_keys = table->s->keys;
+      for (uint j = 0; j < n_keys; j++) {
+        KEY key_info = table->s->key_info[j];
+        if (strcmp(key_info.key_part[0].field->field_name, col_name) == 0) {
+          need_store_field = true;
+          break;
+        }
+      }
+    }
+    if (!need_store_field) {
+      continue;
+    }
+
     if (bitmap_is_set(table->read_set, field->field_index) ||
         bitmap_is_set(table->write_set, field->field_index)) {
 #ifndef DBUG_OFF
@@ -4951,8 +4974,9 @@ int ha_mroonga::reset()
     error = wrapper_reset();
   else
     error = storage_reset();
-  ignoring_duplicated_key = FALSE;
-  fulltext_searching = FALSE;
+  ignoring_no_key_columns = false;
+  ignoring_duplicated_key = false;
+  fulltext_searching = false;
   DBUG_RETURN(error);
 }
 

  Modified: ha_mroonga.h (+2 -0)
===================================================================
--- ha_mroonga.h    2011-09-11 03:44:11 +0000 (6285f87)
+++ ha_mroonga.h    2011-09-11 03:45:44 +0000 (fce6a53)
@@ -148,6 +148,8 @@ private:
   handler_add_index *hnd_add_index;
 #endif
 
+  bool ignoring_no_key_columns;
+
 public:
   ha_mroonga(handlerton *hton, TABLE_SHARE *share);
   ~ha_mroonga();




Groonga-mysql-commit メーリングリストの案内
アーカイブの一覧に戻る