From 1c5ddfd2128bd064568d001c8eff225e6955a19b Mon Sep 17 00:00:00 2001 From: Igor Ippolitov Date: Tue, 11 Aug 2020 17:08:16 +0100 Subject: [PATCH 1/3] let extended queries handle empty responses --- src/pgsql_proto.erl | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/pgsql_proto.erl b/src/pgsql_proto.erl index 874ce5b..35920dd 100644 --- a/src/pgsql_proto.erl +++ b/src/pgsql_proto.erl @@ -491,10 +491,22 @@ process_equery(State, Log) -> {ok, Descs1} = pgsql_util:decode_descs(OidMap, Descs), process_equery_datarow(Descs1, Log, {undefined, Descs, undefined}, AsBin); + {pgsql, {no_data, _}} -> + process_equery_nodata(Log, undefined); {pgsql, Any} -> process_equery(State, [Any|Log]) end. +process_equery_nodata(Log, Command) -> + receive + {pgsql, {command_complete, Command1}} -> + process_equery_nodata(Log, Command1); + {pgsql, {ready_for_query, Status1}} -> + {ok, Command, [], Status1, lists:reverse(Log)}; + {pgsql, Any} -> + process_equery_nodata([Any|Log], Command); + end. + process_equery_datarow(Types, Log, Info={Command, Desc, Status}, AsBin) -> receive %% From f1c9667af1911cea64ecb4bd1c3b1221b9952cb9 Mon Sep 17 00:00:00 2001 From: Igor Ippolitov Date: Tue, 11 Aug 2020 17:33:44 +0100 Subject: [PATCH 2/3] fix a typo --- src/pgsql_proto.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pgsql_proto.erl b/src/pgsql_proto.erl index 35920dd..bdac32d 100644 --- a/src/pgsql_proto.erl +++ b/src/pgsql_proto.erl @@ -504,7 +504,7 @@ process_equery_nodata(Log, Command) -> {pgsql, {ready_for_query, Status1}} -> {ok, Command, [], Status1, lists:reverse(Log)}; {pgsql, Any} -> - process_equery_nodata([Any|Log], Command); + process_equery_nodata([Any|Log], Command) end. process_equery_datarow(Types, Log, Info={Command, Desc, Status}, AsBin) -> From cb4dfef05b80f2ceeeb99f74a412883b4514d7dd Mon Sep 17 00:00:00 2001 From: oxpa Date: Wed, 12 Aug 2020 00:04:38 +0100 Subject: [PATCH 3/3] handle errors gracefully --- src/pgsql_proto.erl | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/pgsql_proto.erl b/src/pgsql_proto.erl index bdac32d..571ed02 100644 --- a/src/pgsql_proto.erl +++ b/src/pgsql_proto.erl @@ -292,14 +292,17 @@ handle_call({equery, {Query, Params}}, _From, State) -> SyncP = encode_message(sync, []), ok = send(Sock, [ParseP, BindP, DescribeP, ExecuteP, SyncP]), - {ok, Command, Desc, Status, Logs} = process_equery(State, []), - - OidMap = State#state.oidmap, - NameTypes = lists:map(fun({Name, _Format, _ColNo, Oid, _, _, _}) -> - {Name, dict:fetch(Oid, OidMap)} - end, - Desc), - Reply = {ok, Command, Status, NameTypes, Logs}, + Reply = case process_equery(State, []) of + {ok, Command, Desc, Status, Logs} -> + OidMap = State#state.oidmap, + NameTypes = lists:map(fun({Name, _Format, _ColNo, Oid, _, _, _}) -> + {Name, dict:fetch(Oid, OidMap)} + end, + Desc), + {ok, Command, Status, NameTypes, Logs}; + {error, Error} -> {error, Error} + end, + {reply, Reply, State}; %% Prepare a statement, so it can be used for queries later on.