diff --git a/lib/postgrex/protocol.ex b/lib/postgrex/protocol.ex index 9bd3b1e0..10cc76cd 100644 --- a/lib/postgrex/protocol.ex +++ b/lib/postgrex/protocol.ex @@ -1253,6 +1253,10 @@ defmodule Postgrex.Protocol do {result, s} = done(s, columns, Enum.reverse(rows), [tag]) recv_simple(s, status, [result | results], [], [], buffer, timeout) + {:ok, msg_empty_query(), buffer} -> + {result, s} = done_empty(s) + recv_simple(s, status, [result | results], [], [], buffer, timeout) + {:ok, msg_error(fields: fields), buffer} -> err = Postgrex.Error.exception(postgres: fields) error_ready(s, status, err, buffer) @@ -3189,6 +3193,19 @@ defmodule Postgrex.Protocol do {result, %{s | messages: []}} end + defp done_empty(%{connection_id: connection_id, messages: messages} = s) do + result = %Postgrex.Result{ + command: nil, + num_rows: 0, + rows: nil, + columns: nil, + connection_id: connection_id, + messages: messages + } + + {result, %{s | messages: []}} + end + defp halt(s, query, rows, tag) do case done(s, query, rows, tag) do {%Postgrex.Result{rows: rows} = result, s} when is_list(rows) -> diff --git a/test/simple_connection_test.exs b/test/simple_connection_test.exs index 8b1988c6..81f4b07e 100644 --- a/test/simple_connection_test.exs +++ b/test/simple_connection_test.exs @@ -98,6 +98,24 @@ defmodule SimpleConnectionTest do assert result2.num_rows == 1 end + test "relaying empty query results", context do + assert {:ok, + [ + %Postgrex.Result{ + command: nil, + columns: nil, + rows: nil, + num_rows: 0 + } + ]} = SC.call(context.conn, {:query, ""}) + + assert {:ok, [%Postgrex.Result{command: nil, rows: nil, num_rows: 0}]} = + SC.call(context.conn, {:query, "-- no statement"}) + + assert {:ok, [%Postgrex.Result{rows: [["1"]]}]} = + SC.call(context.conn, {:query, "SELECT 1"}) + end + test "relaying query errors", context do assert {:ok, %Postgrex.Error{}} = SC.call(context.conn, {:query, "SELCT"}) end