[Groonga-commit] groonga/groonga at 69ef696 [master] ii: check the rest positions in chunk

Back to archive index
Kouhei Sutou null+****@clear*****
Fri Feb 15 11:36:59 JST 2019


Kouhei Sutou	2019-02-15 11:36:59 +0900 (Fri, 15 Feb 2019)

  Revision: 69ef696f6d0531ea9a61ec612f885c069f9c65f9
  https://github.com/groonga/groonga/commit/69ef696f6d0531ea9a61ec612f885c069f9c65f9

  Message:
    ii: check the rest positions in chunk

  Modified files:
    lib/ii.c

  Modified: lib/ii.c (+31 -4)
===================================================================
--- lib/ii.c    2019-02-15 10:51:33 +0900 (43d7e03b9)
+++ lib/ii.c    2019-02-15 11:36:59 +0900 (513f3b02c)
@@ -3196,7 +3196,7 @@ typedef struct {
   uint32_t *tfs;
   uint32_t *weights;
   uint32_t *position_gaps;
-  uint32_t n_position_gaps;
+  uint32_t *position_gaps_end;
 } merger_chunk_data;
 
 typedef struct {
@@ -3331,6 +3331,31 @@ merger_put_next_chunk(grn_ctx *ctx, merger_data *data)
       merger_put_next_id(ctx, data, &(chunk_data->id));
       if ((data->ii->header->flags & GRN_OBJ_WITH_POSITION)) {
         uint32_t i;
+        uint32_t rest_n_positiongs =
+          (uint32_t)(chunk_data->position_gaps_end -
+                     chunk_data->position_gaps);
+        if (chunk_data->id.tf > rest_n_positiongs) {
+          merger_buffer_data *buffer_data = &(data->source.buffer);
+          grn_obj term;
+          DEFINE_NAME(data->ii);
+          GRN_TEXT_INIT(&term, 0);
+          grn_ii_get_term(ctx,
+                          data->ii,
+                          buffer_data->term->tid & GRN_ID_MAX,
+                          &term);
+          GRN_LOG(ctx,
+                  GRN_LOG_WARNING,
+                  "[ii][merge][chunk] "
+                  "the number of terms are larger than the number positions: "
+                  "<%.*s>: <%.*s>(%u): (%u:%u): (%u:%u)",
+                  name_size, name,
+                  (int)GRN_TEXT_LEN(&term), GRN_TEXT_VALUE(&term),
+                  buffer_data->term->tid,
+                  chunk_data->id.rid, chunk_data->id.sid,
+                  chunk_data->id.tf,
+                  rest_n_positiongs);
+          GRN_OBJ_FIN(ctx, &term);
+        }
         for (i = 0; i < chunk_data->id.tf; i++) {
           *(data->dest.position_gaps) = chunk_data->position_gaps[i];
           data->dest.position_gaps++;
@@ -3594,7 +3619,7 @@ chunk_merge(grn_ctx *ctx,
       chunk_data->weights = rdv[j++].data;
     }
     chunk_data->position_gaps = rdv[j].data;
-    chunk_data->n_position_gaps = rdv[j].data_size;
+    chunk_data->position_gaps_end = chunk_data->position_gaps + rdv[j].data_size;
   }
   datavec_reset(ctx,
                 dv,
@@ -3987,7 +4012,8 @@ buffer_merge(grn_ctx *ctx, grn_ii *ii, uint32_t seg, grn_hash *h,
             chunk_data->weights = rdv[j++].data;
           }
           chunk_data->position_gaps = rdv[j].data;
-          chunk_data->n_position_gaps = rdv[j].data_size;
+          chunk_data->position_gaps_end =
+            chunk_data->position_gaps + rdv[j].data_size;
         }
         datavec_reset(ctx,
                       dv,
@@ -4489,7 +4515,8 @@ grn_ii_buffer_check(grn_ctx *ctx, grn_ii *ii, uint32_t seg)
           }
           GRN_OUTPUT_INT64(rdv[j].data_size);
           chunk_data->position_gaps = rdv[j].data;
-          chunk_data->n_position_gaps = rdv[j].data_size;
+          chunk_data->position_gaps_end =
+            chunk_data->position_gaps + rdv[j].data_size;
         }
         nterm_with_chunk++;
       }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20190215/0c150c3f/attachment-0001.html>


More information about the Groonga-commit mailing list
Back to archive index