Thread: Is there a way to describe precision and scale for columns in a s elect statement using libpq?
Is there a way to describe precision and scale for columns in a s elect statement using libpq?
From
Brijesh Shrivastav
Date:
Hi! All, I am a new postgres developer and as is the case with many of us I am porting an existing application to postgres database. One of the requirement for us is to be able to determine the scale and precision for select columns so we can accordingly allordingly allocate memory or inform client applications. I looked at libpq api and found following api to describe a select statement PQfname() PQftype() PQfsize() However, PQfsize() gives me the space alloced for this column in database row. How can I get precision and scale for numeric columns? I have run into another problem. I execute PREPARE statement with pgexec to prepare the query before executing it multiple time with different parameter values. It seems I can't get the select column information untill I perform an PQexecPrepared(). Is there any way around it? Thanks in advance, Brijesh Shrivastav
Brijesh Shrivastav wrote: > > Hi! All, > > I am a new postgres developer and as is the case with many of us I am > porting > an existing application to postgres database. One of the requirement for us > is to be able to determine the scale and precision for select columns so we > can > accordingly allordingly allocate memory or inform client applications. > > I looked at libpq api and found following api to describe a select statement > > PQfname() > PQftype() > PQfsize() > > However, PQfsize() gives me the space alloced for this column in database > row. How > can I get precision and scale for numeric columns? It's a little tricky. Use PQfmod() on the column. Call the result F. The precision is the high 16 bits, and the scale is the low 16 bits, but with an offset of 4 first: precision = ((F - 4) >> 16) & 0xffff; scale = (F - 4) & 0xffff; > I have run into another problem. I execute PREPARE statement with pgexec to > prepare > the query before executing it multiple time with different parameter values. > It > seems I can't get the select column information untill I perform an > PQexecPrepared(). > Is there any way around it? I don't think so. The protocol supports it ("Describe" message on a named prepared statement, without Bind or Execute), and I assume the backend would play along, but I don't think libpq has any way to let you do it in the current release.
L J Bayuk <ljb220@mindspring.com> writes: > Brijesh Shrivastav wrote: >> It seems I can't get the select column information untill I perform an >> PQexecPrepared(). >> Is there any way around it? > I don't think so. The protocol supports it ("Describe" message on a named > prepared statement, without Bind or Execute), and I assume the backend > would play along, but I don't think libpq has any way to let you do it > in the current release. libpq doesn't currently have any API to let you get at Describe-Statement. This is obviously something to fix. There are actually quite a few aspects of the v3 backend protocol that libpq has no API for as yet. I would like to see someone think about prepared statements and parameters in general, and put forward a coherent proposed API for the whole mess. But short of that, we could accept a solution for this particular issue ... regards, tom lane