Skip site navigation (1) Skip section navigation (2)

Re: PQgetvalue failed to return column value for non-text data in binary format

From: Jeff Lynn <jmlynn(at)rogers(dot)com>
To: Andrew McNamara <andrewm(at)object-craft(dot)com(dot)au>
Cc: pgsql-interfaces(at)postgresql(dot)org
Subject: Re: PQgetvalue failed to return column value for non-text data in binary format
Date: 2007-05-21 21:46:37
Message-ID: 4652133D.2080103@rogers.com (view raw or flat)
Thread:
Lists: pgsql-interfaces
Thanks you very much for your help and clarification.  As programmer in 
heart, one tends to go straight the specific api.  I guess once one 
become so comfortable with a particular open source software, then one 
can go to the source to understand what is happening there.  But in my 
case, I guess I am far from that level of sophistication in 
understanding PostgreSQL.

This is interesting position to be taken by PostgreSQL.  For simple 
query, particularly with regards to reporting, one can go about using 
text for all column.  But a lot of time, I deal with large dataset 
ingestions and extracts that tends to take many hours to perform.  So I 
usually prefer binary form data for performance reason.  To that end, I 
found there is a significant different in the time it takes to ingest or 
extract data from one database to another database of totally different 
vendor.  Most of our company's works are done in Java nowadays, but for 
large data ingestions/extract/conversion, a C program out performs Java 
program fair and square, no debate there (based on actual run-time 
data).  For clarification, we deal with various business partners that 
we have to import/export large amount of data between heterogeneous 
databases that the wonderful technology of database replication does not 
apply for our use.

For this kind of operations, I even found the performance gain by 
creating C program out-weight a Java program for that same purpose.

I can get by using the socket function, ntohl() and ntohs() for smallint 
and int4 for the conversion.  But there is no such thing for the float4 
and float8 as well as the date, timestamp you mentioned.  I wish there 
is such function or macro available for the C interface. 

I do not agree with the "ease of portability" issue, because if that is 
the case, one can always give up performance and use Java for that 
purpose.  Beside, it should not be that much more difficult to provide 
win32 exe for PostgreSQL with PQgetvalue() that return int2, int4, 
float4, float8, date, datetime/timestamp, etc.

Jeff,

Andrew McNamara wrote:
> The data returned in binary mode is in a (largely undocumented)
> PostgreSQL form. Types like int4, and float8 are returned in network
> byte order [1], while other types such as timestamps are in more subtle
> formats. The only canonical reference to these formats is the PostgreSQL
> source. 
>
> In general, you should just use the text format, as it's more portable
> and less likely to change over time, although the specifics of the text
> format are also largely undocumented.
>
> [1] http://en.wikipedia.org/wiki/Endianness
>
>   



In response to

Responses

pgsql-interfaces by date

Next:From: Andrew McNamaraDate: 2007-05-21 23:39:56
Subject: Re: PQgetvalue failed to return column value for non-text data in binary format
Previous:From: Andrew McNamaraDate: 2007-05-21 05:57:59
Subject: Re: PQgetvalue failed to return column value for non-text data in binary format

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group