fix(_view changes feed): fix function_clause crash in couch_native_process.
authorAlexanderKaraberov <3254818+AlexanderKaraberov@users.noreply.github.com>
Thu, 31 May 2018 08:23:40 +0000 (10:23 +0200)
committerAlexanderKaraberov <3254818+AlexanderKaraberov@users.noreply.github.com>
Fri, 29 Jun 2018 09:08:56 +0000 (11:08 +0200)
Crash was caused by a missing implementation of ddoc function for <<"views">> FunPath, implementation is based on FilterFun but matches return values of the erlang:put()  which is called in the native Emit function and also expects ok and false when docs were not emitted.

src/couch/src/couch_native_process.erl

index 6d66c93..8f8ce8b 100644 (file)
@@ -226,6 +226,18 @@ ddoc(State, {_, Fun}, [<<"filters">>|_], [Docs, Req]) ->
     end,
     Resp = lists:map(FilterFunWrapper, Docs),
     {State, [true, Resp]};
+ddoc(State, {_, Fun}, [<<"views">>|_], [Docs]) ->
+    MapFunWrapper = fun(Doc) ->
+        case catch Fun(Doc) of
+        undefined -> true;
+        ok -> false;
+        false -> false;
+        [_|_] -> true;
+        {'EXIT', Error} -> couch_log:error("~p", [Error])
+        end
+    end,
+    Resp = lists:map(MapFunWrapper, Docs),
+    {State, [true, Resp]};
 ddoc(State, {_, Fun}, [<<"shows">>|_], Args) ->
     Resp = case (catch apply(Fun, Args)) of
         FunResp when is_list(FunResp) ->