anchor.diff:      send(State, $H, []),
       {noreply, State#state{queue = queue:in(Req, Q)}};
   
  -handle_cast(Req = {_, {describe, Type, Name}}, State) ->
  -    #state{queue = Q} = State,
  -    case Type of
  -        statement -> Type2 = $S;
  -        portal    -> Type2 = $P
  -    end,
  -    send(State, $D, [Type2, Name, 0]),
  +handle_cast(Req = {_, {describe_statement, Name}}, State) ->
  +    #state{queue = Q} = State,
  +    send(State, $D, [$S, Name, 0]),
  +    send(State, $H, []),
  +    {noreply, State#state{queue = queue:in(Req, Q)}};
  +
  +handle_cast(Req = {_, {describe_portal, Name}}, State) ->
  +    #state{queue = Q} = State,
  +    send(State, $D, [$P, Name, 0]),
       send(State, $H, []),
       {noreply, State#state{queue = queue:in(Req, Q)}};
   
  
positive.code: 
  %% ParameterDescription
  on_message({$t, <<_Count:?int16, Bin/binary>>}, State) ->
      Types = [pgsql_types:oid2type(Oid) || <<Oid:?int32>> <= Bin],
      notify(State, {types, Types}),
      {noreply, State};
  
  %% RowDescription
  on_message({$T, <<Count:?int16, Bin/binary>>}, State) ->
      #state{queue = Q} = State,
      Columns = pgsql_wire:decode_columns(Count, Bin),
      notify(State, {columns, Columns}),
      State2 = case request_tag(State) of
                   C when C == squery ->
                       %% TODO drop them on completion
                       State#state{columns = Columns};
                   C when C == parse; C == describe ->
                       State#state{queue = queue:drop(Q)}
               end,
      {noreply, State2};
  
negative.code:                 queue = queue:new(),
                  async,
                  parameters = [],
                  statement,
                  columns,
                  rows = [],
                  sync_required,
                  txstatus}).
  
  