[Groonga-commit] groonga/groonga at 920733c [master] expr: update pointers stored in expr when expr->codes is reallocated

Back to archive index

Susumu Yata null+****@clear*****
Fri Feb 19 16:04:33 JST 2016


Susumu Yata	2016-02-19 16:04:33 +0900 (Fri, 19 Feb 2016)

  New Revision: 920733cfb424e6c6fe932757c4f7f2c673670be1
  https://github.com/groonga/groonga/commit/920733cfb424e6c6fe932757c4f7f2c673670be1

  Message:
    expr: update pointers stored in expr when expr->codes is reallocated
    
    Before this change, --query with 3,000 ORs failed.
    After this change, --query with 10,000 ORs succeeded.
    
    GitHub: #484

  Modified files:
    lib/expr.c

  Modified: lib/expr.c (+13 -1)
===================================================================
--- lib/expr.c    2016-02-19 12:42:58 +0900 (54dc48b)
+++ lib/expr.c    2016-02-19 16:04:33 +0900 (9324f9a)
@@ -776,13 +776,25 @@ grn_expr_append_obj(grn_ctx *ctx, grn_obj *expr, grn_obj *obj, grn_operator op,
   grn_expr *e = (grn_expr *)expr;
   GRN_API_ENTER;
   if (e->codes_curr >= e->codes_size) {
+    grn_expr_dfi *dfis = (grn_expr_dfi *)GRN_BULK_HEAD(&e->dfi);
+    size_t i, n_dfis = GRN_BULK_VSIZE(&e->dfi) / sizeof(grn_expr_dfi);
     uint32_t new_codes_size = e->codes_size * 2;
     size_t n_bytes = sizeof(grn_expr_code) * new_codes_size;
-    grn_expr_code *new_codes = (grn_expr_code *)GRN_REALLOC(e->codes, n_bytes);
+    grn_expr_code *new_codes = (grn_expr_code *)GRN_MALLOC(n_bytes);
     if (!new_codes) {
       ERR(GRN_NO_MEMORY_AVAILABLE, "stack is full");
       goto exit;
     }
+    grn_memcpy(new_codes, e->codes, sizeof(grn_expr_code) * e->codes_size);
+    if (e->code0 >= e->codes && e->code0 < e->codes + e->codes_size) {
+      e->code0 = new_codes + (e->code0 - e->codes);
+    }
+    for (i = 0; i < n_dfis; i++) {
+      if (dfis[i].code >= e->codes && dfis[i].code < e->codes + e->codes_size) {
+        dfis[i].code = new_codes + (dfis[i].code - e->codes);
+      }
+    }
+    GRN_FREE(e->codes);
     e->codes = new_codes;
     e->codes_size = new_codes_size;
   }
-------------- next part --------------
HTML����������������������������...
Download 



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