I'm implementing a driver to PostgreSQL and gets an RowDescription
message and a few DataRow
messages in response to a database query. But how do I get the type for the columns returned? E.g. the first column should be an int
and the second an varchar(20)
.
Here are some printouts from RowDescription
:
[RowDescription] 2 rows
[Row] id
tableObjId: 16393
attrNr: 1
objId: 23
dataTypeSz: 4
typeModifier: -1
formatCode: 0
[Row] name
tableObjId: 16393
attrNr: 2
objId: 1043
dataTypeSz: -1
typeModifier: 24
formatCode: 0
and for the DataRow
:
[DataRow] 2 columns
data: 2
data: Jonas
[DataRow] 2 columns
data: 76
data: Anders
Any suggestions? Is this anything I have to lookup in any systemtables?
objId
is the reference topg_type.oid
for the column type. 23 isint4
and 1043 isvarchar
(select * from pg_type where oid in (23,1043)
)The type modifier for the second column should indicate the qualifier on varchar, although I'm not quite sure why it's 24 rather than 20. Probably because that's the length of the varlena structure returned, which has a 32-bit length prepended. Anyway, that's how typmod works: if you do
select pg_catalog.format_type(1043, 24)
, you'll see that the output ischaracter varying(20)
. The documentation for PQfmod says that the typmod interpretation is type-specific.