[Groonga-commit] groonga/groonga at 41fefd1 [master] Avoid access to non existence sub records for group

Back to archive index

Naoya Murakami null+****@clear*****
Sat Jan 14 00:31:21 JST 2017


Naoya Murakami	2017-01-14 00:31:21 +0900 (Sat, 14 Jan 2017)

  New Revision: 41fefd15d1b84b02018569b97d53564a86da25ce
  https://github.com/groonga/groonga/commit/41fefd15d1b84b02018569b97d53564a86da25ce

  Merged 571ff56: Merge pull request #625 from naoa/group-calc-accessor-check

  Message:
    Avoid access to non existence sub records for group

  Modified files:
    lib/db.c

  Modified: lib/db.c (+20 -0)
===================================================================
--- lib/db.c    2017-01-13 12:49:54 +0900 (e7365f8)
+++ lib/db.c    2017-01-14 00:31:21 +0900 (5758f86)
@@ -5575,6 +5575,17 @@ grn_obj_get_accessor_rset_value(grn_ctx *ctx, grn_obj *obj,
     (*rp)->obj = obj;
 
     switch (action) {
+#define CHECK_GROUP_CALC_FLAG(flag) do {   \
+      if (GRN_TABLE_IS_GROUPED(obj)) {     \
+        grn_table_group_flags flags;       \
+        flags = DB_OBJ(obj)->flags.group;  \
+        if (flags & flag) {                \
+          succeeded = GRN_TRUE;            \
+          (*rp)->action = action;          \
+          goto exit;                       \
+        }                                  \
+      }                                    \
+    } while(GRN_FALSE)
     case GRN_ACCESSOR_GET_SCORE :
       if (DB_OBJ(obj)->header.flags & GRN_OBJ_WITH_SUBREC) {
         (*rp)->action = action;
@@ -5583,9 +5594,17 @@ grn_obj_get_accessor_rset_value(grn_ctx *ctx, grn_obj *obj,
       }
       break;
     case GRN_ACCESSOR_GET_MAX :
+      CHECK_GROUP_CALC_FLAG(GRN_TABLE_GROUP_CALC_MAX);
+      break;
     case GRN_ACCESSOR_GET_MIN :
+      CHECK_GROUP_CALC_FLAG(GRN_TABLE_GROUP_CALC_MIN);
+      break;
     case GRN_ACCESSOR_GET_SUM :
+      CHECK_GROUP_CALC_FLAG(GRN_TABLE_GROUP_CALC_SUM);
+      break;
     case GRN_ACCESSOR_GET_AVG :
+      CHECK_GROUP_CALC_FLAG(GRN_TABLE_GROUP_CALC_AVG);
+      break;
     case GRN_ACCESSOR_GET_NSUBRECS :
       if (GRN_TABLE_IS_GROUPED(obj)) {
         (*rp)->action = action;
@@ -5614,6 +5633,7 @@ grn_obj_get_accessor_rset_value(grn_ctx *ctx, grn_obj *obj,
     if (!(obj = grn_ctx_at(ctx, obj->header.domain))) {
       goto exit;
     }
+#undef CHECK_GROUP_CALC_FLAG
   }
 
 exit :
-------------- next part --------------
HTML����������������������������...
Download 



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