lib/pq — pull request #89 by jmcvetta (2013-03-15 22:00:11+00:00)
Title: Transaction rollback bug

I have encountered a bug in transaction rollback handling. The bug occurs when one opens a transaction, issues a query, rolls back the transaction, then tries to issue another query on the same `DB` object that was used to create the transaction.

Error message is:

```
pq: unexpected describe rows response: 'C'
````

Error is coming from here: https://github.com/lib/pq/blob/master/conn.go#L216

[Postgres manual](http://www.postgresql.org/docs/9.1/static/protocol-message-formats.html) says 'C' is a legitimate response header:

```
CommandComplete (B)
Byte1('C')
Identifies the message as a command-completed response.

Int32
Length of message contents in bytes, including self.

String
The command tag. This is usually a single word that identifies which SQL command was completed.

For an INSERT command, the tag is INSERT oid rows, where rows is the number of rows inserted. oid is the object ID of the inserted row if rows is 1 and the target table has OIDs; otherwise oid is 0.

For a DELETE command, the tag is DELETE rows where rows is the number of rows deleted.

For an UPDATE command, the tag is UPDATE rows where rows is the number of rows updated.

For a SELECT or CREATE TABLE AS command, the tag is SELECT rows where rows is the number of rows retrieved.

For a MOVE command, the tag is MOVE rows where rows is the number of rows the cursor's position has been changed by.

For a FETCH command, the tag is FETCH rows where rows is the number of rows that have been retrieved from the cursor.

For a COPY command, the tag is COPY rows where rows is the number of rows copied. (Note: the row count appears only in PostgreSQL 8.2 and later.)
```

Here's how `libpq` handles it: http://doxygen.postgresql.org/fe-protocol3_8c_source.html#l00199

# Test Case

This pull request contains a test case, `TestRollback()`, that reliably reproduces the bug.

# Impact

This bug is currently blocking development of PostgreSQL dialect of `qbs` ORM: https://github.com/coocood/qbs/pull/11