Browse Source

Merge pull request #115 from seriyps/del_upd_returning_zero

Fix `UPDATE/DELETE ... RETURNING ..` returning 0 rows
Sergey Prokhorov 8 years ago
parent
commit
ff81769fc7
3 changed files with 16 additions and 6 deletions
  1. 4 3
      src/epgsql_sock.erl
  2. 1 1
      test/epgsql_incremental.erl
  3. 11 2
      test/epgsql_tests.erl

+ 4 - 3
src/epgsql_sock.erl

@@ -730,7 +730,8 @@ on_message({?COMMAND_COMPLETE, Bin}, State0) ->
     Command = command_tag(State),
     Notice = {complete, Complete},
     Rows = lists:reverse(State#state.rows),
-    State2 = case {Command, Complete, Rows} of
+    Columns = get_columns(State),
+    State2 = case {Command, Complete, Columns} of
                  {execute, {_, Count}, []} ->
                      finish(State, Notice, {ok, Count});
                  {execute, {_, Count}, _} ->
@@ -746,9 +747,9 @@ on_message({?COMMAND_COMPLETE, Bin}, State0) ->
                  {C, {_, Count}, []} when C == squery; C == equery; C == prepared_query ->
                      add_result(State, Notice, {ok, Count});
                  {C, {_, Count}, _} when C == squery; C == equery; C == prepared_query ->
-                     add_result(State, Notice, {ok, Count, get_columns(State), Rows});
+                     add_result(State, Notice, {ok, Count, Columns, Rows});
                  {C, _, _} when C == squery; C == equery; C == prepared_query ->
-                     add_result(State, Notice, {ok, get_columns(State), Rows})
+                     add_result(State, Notice, {ok, Columns, Rows})
              end,
     {noreply, State2};
 

+ 1 - 1
test/epgsql_incremental.erl

@@ -187,7 +187,7 @@ receive_result(C, Ref, Cols, Rows) ->
         {C, Ref, {error, _E} = Error} ->
             Error;
         {C, Ref, {complete, {_Type, Count}}} ->
-            case Rows of
+            case Cols of
                 [] -> {ok, Count};
                 _L -> {ok, Count, Cols, lists:reverse(Rows)}
             end;

+ 11 - 2
test/epgsql_tests.erl

@@ -269,14 +269,23 @@ returning_from_update_test(Module) ->
     with_rollback(
       Module,
       fun(C) ->
-              {ok, 2, _Cols, [{1}, {2}]} = Module:equery(C, "update test_table1 set value = 'hi' returning id")
+              {ok, 2, _Cols, [{1}, {2}]} = Module:equery(C, "update test_table1 set value = 'hi' returning id"),
+              ?assertMatch({ok, 0, [#column{}], []},
+                           Module:equery(C, "update test_table1 set value = 'hi' where false returning id")),
+              ?assertMatch([{ok, 2, [#column{}], [{<<"1">>}, {<<"2">>}]},
+                            {ok, 0, [#column{}], []}],
+                           Module:squery(C,
+                                         "update test_table1 set value = 'hi2' returning id; "
+                                         "update test_table1 set value = 'hi' where false returning id"))
       end).
 
 returning_from_delete_test(Module) ->
     with_rollback(
       Module,
       fun(C) ->
-              {ok, 2, _Cols, [{1}, {2}]} = Module:equery(C, "delete from test_table1 returning id")
+              {ok, 2, _Cols, [{1}, {2}]} = Module:equery(C, "delete from test_table1 returning id"),
+              ?assertMatch({ok, 0, [#column{}], []},
+                           Module:equery(C, "delete from test_table1 returning id"))
       end).
 
 parse_test(Module) ->