[Groonga-commit] groonga/groonga at 08dc18a [master] select: don't cache when output_columns uses not stable function

Back to archive index

Kouhei Sutou null+****@clear*****
Fri Feb 2 11:32:43 JST 2018


Kouhei Sutou	2018-02-02 11:32:43 +0900 (Fri, 02 Feb 2018)

  New Revision: 08dc18a8e3c859af256de3b9a87644b15909da93
  https://github.com/groonga/groonga/commit/08dc18a8e3c859af256de3b9a87644b15909da93

  Message:
    select: don't cache when output_columns uses not stable function

  Added files:
    test/command/suite/select/cache/stable_function/output_columns.expected
    test/command/suite/select/cache/stable_function/output_columns.test
  Modified files:
    lib/proc/proc_select.c

  Modified: lib/proc/proc_select.c (+112 -42)
===================================================================
--- lib/proc/proc_select.c    2018-02-01 11:04:34 +0900 (c64c142da)
+++ lib/proc/proc_select.c    2018-02-02 11:32:43 +0900 (49a5d996a)
@@ -1227,6 +1227,71 @@ grn_proc_select_output_columns(grn_ctx *ctx,
   return grn_proc_select_output_columns_close(ctx, &format, res);
 }
 
+static grn_bool
+grn_select_output_columns_open(grn_ctx *ctx,
+                               grn_select_data *data,
+                               grn_obj_format *format,
+                               grn_obj *res,
+                               int n_hits,
+                               int offset,
+                               int limit,
+                               const char *columns,
+                               int columns_len,
+                               grn_obj *condition,
+                               uint32_t n_additional_elements)
+{
+  if (!grn_proc_select_output_columns_open(ctx,
+                                           format,
+                                           res,
+                                           n_hits,
+                                           offset,
+                                           limit,
+                                           columns,
+                                           columns_len,
+                                           condition,
+                                           n_additional_elements)) {
+    return GRN_FALSE;
+  }
+
+  if (format->expression) {
+    data->cacheable *= ((grn_expr *)format->expression)->cacheable;
+    data->taintable += ((grn_expr *)format->expression)->taintable;
+  }
+
+  return GRN_TRUE;
+}
+
+static grn_bool
+grn_select_output_columns(grn_ctx *ctx,
+                          grn_select_data *data,
+                          grn_obj *res,
+                          int n_hits,
+                          int offset,
+                          int limit,
+                          const char *columns,
+                          int columns_len,
+                          grn_obj *condition)
+{
+  grn_obj_format format;
+  uint32_t n_additional_elements = 0;
+
+  if (!grn_select_output_columns_open(ctx,
+                                      data,
+                                      &format,
+                                      res,
+                                      n_hits,
+                                      offset,
+                                      limit,
+                                      columns,
+                                      columns_len,
+                                      condition,
+                                      n_additional_elements)) {
+    return GRN_FALSE;
+  }
+
+  return grn_proc_select_output_columns_close(ctx, &format, res);
+}
+
 static grn_obj *
 grn_select_create_all_selected_result_table(grn_ctx *ctx,
                                             grn_obj *table)
@@ -1891,16 +1956,17 @@ grn_select_output_match_open(grn_ctx *ctx,
     output_table = data->tables.result;
   }
   succeeded =
-    grn_proc_select_output_columns_open(ctx,
-                                        format,
-                                        output_table,
-                                        grn_table_size(ctx, data->tables.result),
-                                        offset,
-                                        data->limit,
-                                        data->output_columns.value,
-                                        data->output_columns.length,
-                                        data->filter.condition.expression,
-                                        n_additional_elements);
+    grn_select_output_columns_open(ctx,
+                                   data,
+                                   format,
+                                   output_table,
+                                   grn_table_size(ctx, data->tables.result),
+                                   offset,
+                                   data->limit,
+                                   data->output_columns.value,
+                                   data->output_columns.length,
+                                   data->filter.condition.expression,
+                                   n_additional_elements);
   GRN_QUERY_LOG(ctx, GRN_QUERY_LOG_SIZE,
                 ":", "output(%d)", data->limit);
 
@@ -2061,14 +2127,15 @@ grn_select_output_slices(grn_ctx *ctx,
           grn_table_sort(ctx, slice->table, offset, limit,
                          sorted, sort_keys, n_sort_keys);
           data->output.formatter->slice_label(ctx, data, slice);
-          if (!grn_proc_select_output_columns(ctx,
-                                              sorted,
-                                              n_hits,
-                                              0,
-                                              limit,
-                                              slice->output_columns.value,
-                                              slice->output_columns.length,
-                                              slice->filter.condition.expression)) {
+          if (!grn_select_output_columns(ctx,
+                                         data,
+                                         sorted,
+                                         n_hits,
+                                         0,
+                                         limit,
+                                         slice->output_columns.value,
+                                         slice->output_columns.length,
+                                         slice->filter.condition.expression)) {
             succeeded = GRN_FALSE;
           }
           grn_obj_unlink(ctx, sorted);
@@ -2079,14 +2146,15 @@ grn_select_output_slices(grn_ctx *ctx,
       }
     } else {
       data->output.formatter->slice_label(ctx, data, slice);
-      if (!grn_proc_select_output_columns(ctx,
-                                          slice->table,
-                                          n_hits,
-                                          offset,
-                                          limit,
-                                          slice->output_columns.value,
-                                          slice->output_columns.length,
-                                          slice->filter.condition.expression)) {
+      if (!grn_select_output_columns(ctx,
+                                     data,
+                                     slice->table,
+                                     n_hits,
+                                     offset,
+                                     limit,
+                                     slice->output_columns.value,
+                                     slice->output_columns.length,
+                                     slice->filter.condition.expression)) {
         succeeded = GRN_FALSE;
       }
     }
@@ -2701,14 +2769,15 @@ grn_select_output_drilldowns(grn_ctx *ctx,
           grn_table_sort(ctx, target_table, offset, limit,
                          sorted, sort_keys, n_sort_keys);
           data->output.formatter->drilldown_label(ctx, data, drilldown);
-          if (!grn_proc_select_output_columns(ctx,
-                                              sorted,
-                                              n_hits,
-                                              0,
-                                              limit,
-                                              drilldown->output_columns.value,
-                                              drilldown->output_columns.length,
-                                              data->filter.condition.expression)) {
+          if (!grn_select_output_columns(ctx,
+                                         data,
+                                         sorted,
+                                         n_hits,
+                                         0,
+                                         limit,
+                                         drilldown->output_columns.value,
+                                         drilldown->output_columns.length,
+                                         data->filter.condition.expression)) {
             succeeded = GRN_FALSE;
           }
           grn_obj_unlink(ctx, sorted);
@@ -2719,14 +2788,15 @@ grn_select_output_drilldowns(grn_ctx *ctx,
       }
     } else {
       data->output.formatter->drilldown_label(ctx, data, drilldown);
-      if (!grn_proc_select_output_columns(ctx,
-                                          target_table,
-                                          n_hits,
-                                          offset,
-                                          limit,
-                                          drilldown->output_columns.value,
-                                          drilldown->output_columns.length,
-                                          data->filter.condition.expression)) {
+      if (!grn_select_output_columns(ctx,
+                                     data,
+                                     target_table,
+                                     n_hits,
+                                     offset,
+                                     limit,
+                                     drilldown->output_columns.value,
+                                     drilldown->output_columns.length,
+                                     data->filter.condition.expression)) {
         succeeded = GRN_FALSE;
       }
     }

  Added: test/command/suite/select/cache/stable_function/output_columns.expected (+15 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/cache/stable_function/output_columns.expected    2018-02-02 11:32:43 +0900 (9710dc17b)
@@ -0,0 +1,15 @@
+table_create Records TABLE_NO_KEY
+[[0,0.0,0.0],true]
+load --table Records
+[
+{}
+]
+[[0,0.0,0.0],1]
+#>select --output_columns "now()" --table "Records"
+#:000000000000000 select(1)
+#:000000000000000 output(1)
+#<000000000000000 rc=0
+#>select --output_columns "now()" --table "Records"
+#:000000000000000 select(1)
+#:000000000000000 output(1)
+#<000000000000000 rc=0

  Added: test/command/suite/select/cache/stable_function/output_columns.test (+21 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/cache/stable_function/output_columns.test    2018-02-02 11:32:43 +0900 (8f3064163)
@@ -0,0 +1,21 @@
+table_create Records TABLE_NO_KEY
+
+load --table Records
+[
+{}
+]
+
+# For use cache
+#@sleep 1
+
+#@collect-query-log true
+#@disable-logging
+select Records --output_columns 'now()'
+#@enable-logging
+
+#@sleep 1
+
+#@disable-logging
+select Records --output_columns 'now()'
+#@enable-logging
+#@collect-query-log false
-------------- next part --------------
HTML����������������������������...
URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180202/df66b2e4/attachment-0001.htm 



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