Merge remote-tracking branch 'banjiewen/stale-stable-update'
diff --git a/include/couch_mrview.hrl b/include/couch_mrview.hrl
index bfd20ad..a341e30 100644
--- a/include/couch_mrview.hrl
+++ b/include/couch_mrview.hrl
@@ -77,7 +77,8 @@
     skip = 0,
     group_level = 0,
     group = undefined,
-    stale = false,
+    stable = false,
+    update = true,
     multi_get = false,
     inclusive_end = true,
     include_docs = false,
diff --git a/src/couch_mrview_http.erl b/src/couch_mrview_http.erl
index b554e36..7e3fd78 100644
--- a/src/couch_mrview_http.erl
+++ b/src/couch_mrview_http.erl
@@ -518,11 +518,25 @@
         "limit" ->
             Args#mrargs{limit=parse_pos_int(Val)};
         "stale" when Val == "ok" orelse Val == <<"ok">> ->
-            Args#mrargs{stale=ok};
+            Args#mrargs{stable=true, update=false};
         "stale" when Val == "update_after" orelse Val == <<"update_after">> ->
-            Args#mrargs{stale=update_after};
+            Args#mrargs{stable=true, update=lazy};
         "stale" ->
             throw({query_parse_error, <<"Invalid value for `stale`.">>});
+        "stable" when Val == "true" orelse Val == <<"true">> ->
+            Args#mrargs{stable=true};
+        "stable" when Val == "false" orelse Val == <<"false">> ->
+            Args#mrargs{stable=false};
+        "stable" ->
+            throw({query_parse_error, <<"Invalid value for `stable`.">>});
+        "update" when Val == "true" orelse Val == <<"true">> ->
+            Args#mrargs{update=true};
+        "update" when Val == "false" orelse Val == <<"false">> ->
+            Args#mrargs{update=false};
+        "update" when Val == "lazy" orelse Val == <<"lazy">> ->
+            Args#mrargs{update=lazy};
+        "update" ->
+            throw({query_parse_error, <<"Invalid value for `update`.">>});
         "descending" ->
             case parse_boolean(Val) of
                 true -> Args#mrargs{direction=rev};
diff --git a/src/couch_mrview_util.erl b/src/couch_mrview_util.erl
index fa81ac9..3830b96 100644
--- a/src/couch_mrview_util.erl
+++ b/src/couch_mrview_util.erl
@@ -44,15 +44,15 @@
     DbUpdateSeq = couch_util:with_db(Db, fun(WDb) ->
         couch_db:get_update_seq(WDb)
     end),
-    MinSeq = case Args2#mrargs.stale of
-        ok -> 0; update_after -> 0; _ -> DbUpdateSeq
+    MinSeq = case Args2#mrargs.update of
+        false -> 0; lazy -> 0; _ -> DbUpdateSeq
     end,
     {ok, State} = case couch_index:get_state(Pid, MinSeq) of
         {ok, _} = Resp -> Resp;
         Error -> throw(Error)
     end,
     Ref = erlang:monitor(process, State#mrst.fd),
-    if Args2#mrargs.stale == update_after ->
+    if Args2#mrargs.update == lazy ->
         spawn(fun() -> catch couch_index:get_state(Pid, DbUpdateSeq) end);
         true -> ok
     end,
@@ -476,11 +476,17 @@
         {map, _} -> mrverror(<<"Invalid use of grouping on a map view.">>)
     end,
 
-    case Args#mrargs.stale of
-        ok -> ok;
-        update_after -> ok;
+    case Args#mrargs.stable of
+        true -> ok;
         false -> ok;
-        _ -> mrverror(<<"Invalid value for `stale`.">>)
+        _ -> mrverror(<<"Invalid value for `stable`.">>)
+    end,
+
+    case Args#mrargs.update of
+        true -> ok;
+        false -> ok;
+        lazy -> ok;
+        _ -> mrverror(<<"Invalid value for `update`.">>)
     end,
 
     case is_boolean(Args#mrargs.inclusive_end) of