anchor.diff:  on_message({$T, <<Count:?int16, Bin/binary>>}, State) ->
       Columns = pgsql_wire:decode_columns(Count, Bin),
       State2 = case command_tag(State) of
  -                 C when C == squery ->
  +                 squery ->
                        State#state{columns = Columns};
                    C when C == parse; C == describe_statement ->
  +                     %% TODO set binary format to supported columns
                        reply(State,
                              {ok, State#state.statement#statement{
                                                 columns = Columns}});
  -                 C when C == describe_portal ->
  +                 describe_portal ->
                        reply(State, {ok, Columns})
                end,
       {noreply, State2};
  
positive.code:         [Channel, Payload] -> ok;
          [Channel]          -> Payload = <<>>
      end,
      %% TODO use it
      notify_async(State, {notification, Channel, Pid, Payload}),
      {noreply, State}.
  
  
negative.code: handle_cast(cancel, State = #state{backend = {Pid, Key}}) ->
      {ok, {Addr, Port}} = inet:peername(State#state.sock),
      SockOpts = [{active, false}, {packet, raw}, binary],
      %% TODO timeout
      {ok, Sock} = gen_tcp:connect(Addr, Port, SockOpts),
      Msg = <<16:?int32, 80877102:?int32, Pid:?int32, Key:?int32>>,
      ok = gen_tcp:send(Sock, Msg),
  