Browse Source

Merge pull request #211 from seriyps/fix-describe-portal

Fix describe(_, portal, _); add tests
Sergey Prokhorov 5 years ago
parent
commit
ae9c0be00e
3 changed files with 37 additions and 7 deletions
  1. 4 4
      src/commands/epgsql_cmd_describe_portal.erl
  2. 18 0
      test/epgsql_SUITE.erl
  3. 15 3
      test/epgsql_incremental.erl

+ 4 - 4
src/commands/epgsql_cmd_describe_portal.erl

@@ -26,12 +26,12 @@ execute(Sock, #desc_portal{name = Name} = St) ->
       ]),
       ]),
     {ok, Sock, St}.
     {ok, Sock, St}.
 
 
-handle_message(?ROW_DESCRIPTION, <<Count:?int16, Bin/binary>>, Sock, St) ->
+handle_message(?ROW_DESCRIPTION, <<Count:?int16, Bin/binary>>, Sock, _St) ->
     Codec = epgsql_sock:get_codec(Sock),
     Codec = epgsql_sock:get_codec(Sock),
     Columns = epgsql_wire:decode_columns(Count, Bin, Codec),
     Columns = epgsql_wire:decode_columns(Count, Bin, Codec),
-    {finish, {ok, Columns}, {columns, Columns}, St};
-handle_message(?NO_DATA, <<>>, _Sock, _State) ->
-    {finish, {ok, []}, no_data};
+    {finish, {ok, Columns}, {columns, Columns}, Sock};
+handle_message(?NO_DATA, <<>>, Sock, _State) ->
+    {finish, {ok, []}, no_data, Sock};
 handle_message(?ERROR, Error, _Sock, _State) ->
 handle_message(?ERROR, Error, _Sock, _State) ->
     Result = {error, Error},
     Result = {error, Error},
     {sync_required, Result};
     {sync_required, Result};

+ 18 - 0
test/epgsql_SUITE.erl

@@ -111,6 +111,7 @@ groups() ->
         describe_with_param,
         describe_with_param,
         describe_named,
         describe_named,
         describe_error,
         describe_error,
+        describe_portal,
         portal,
         portal,
         returning,
         returning,
         multiple_statement,
         multiple_statement,
@@ -681,6 +682,23 @@ describe_error(Config) ->
 
 
     end).
     end).
 
 
+describe_portal(Config) ->
+    Module = ?config(module, Config),
+    epgsql_ct:with_connection(Config, fun(C) ->
+        {ok, Stmt} = Module:parse(C, "my_stmt", "select * from test_table1 WHERE id = $1", []),
+        ok = Module:bind(C, Stmt, "my_portal", [1]),
+        {ok, Columns} = Module:describe(C, portal, "my_portal"),
+        ?assertMatch(
+           [#column{name = <<"id">>,
+                    type = int4},
+            #column{name = <<"value">>,
+                    type = text}],
+           Columns
+          ),
+        ok = Module:close(C, Stmt),
+        ok = Module:sync(C)
+    end).
+
 portal(Config) ->
 portal(Config) ->
     Module = ?config(module, Config),
     Module = ?config(module, Config),
     epgsql_ct:with_connection(Config, fun(C) ->
     epgsql_ct:with_connection(Config, fun(C) ->

+ 15 - 3
test/epgsql_incremental.erl

@@ -144,9 +144,9 @@ describe(C, statement, Name) ->
     Ref = epgsqli:describe(C, statement, Name),
     Ref = epgsqli:describe(C, statement, Name),
     sync_on_error(C, receive_describe(C, Ref, #statement{name = Name}));
     sync_on_error(C, receive_describe(C, Ref, #statement{name = Name}));
 
 
-describe(C, Type, Name) ->
-    %% TODO unknown result format of Describe portal
-    epgsqli:describe(C, Type, Name).
+describe(C, portal, Name) ->
+    Ref = epgsqli:describe(C, portal, Name),
+    sync_on_error(C, receive_describe_portal(C, Ref)).
 
 
 close(C, #statement{name = Name}) ->
 close(C, #statement{name = Name}) ->
     close(C, statement, Name).
     close(C, statement, Name).
@@ -241,6 +241,18 @@ receive_describe(C, Ref, Statement = #statement{}) ->
             {error, closed}
             {error, closed}
     end.
     end.
 
 
+receive_describe_portal(C, Ref) ->
+    receive
+        {C, Ref, {columns, Columns}} ->
+            {ok, Columns};
+        {C, Ref, no_data} ->
+            {ok, []};
+        {C, Ref, Error = {error, _}} ->
+            Error;
+        {'EXIT', C, _Reason} ->
+            {error, closed}
+    end.
+
 receive_atom(C, Ref, Receive, Return) ->
 receive_atom(C, Ref, Receive, Return) ->
     receive
     receive
         {C, Ref, Receive} ->
         {C, Ref, Receive} ->