As required by PEP-249, the information you request is stored as part of the cursor's .description attribute:

Cursor Objects should respond to the following methods and attributes.
Cursor attributes

.description

This read-only attribute is a sequence of 7-item sequences.

Each of these sequences contains information describing one result column:

   name
   type_code
   display_size
   internal_size
   precision
   scale
   null_ok

The first two items (name and type_code) are mandatory, the other five are optional and are set to None if no meaningful values can be provided.

http://legacy.python.org/dev/peps/pep-0249/#connection-objects

In adodbapi, the value of cursor.description[i][0] is obtained from the recordset as your patch suggests. However, some database engines (such as PostgreSQL) return their column header values as lower cased strings. There is no help for that. You should be able to get your list of the column names as provided by the engine using:

colNames = [d[0] for d in cursor.description]

Perhaps confusion is caused by adodbapi's cursor.columnNames attribute which is not part of the PEP. It is a dictionary of lower cased column names used to provide a namedtuple sort of index into the rowset. I should have named it cursor._columnNames to emphasize that it is an internal implementation detail, but I failed to do that.