Type identification with libpq / PQFmod() when using aggregates (SUM)

From: Sebastien FLAESCH <sf(at)4js(dot)com>
To: pgsql-interfaces(at)postgresql(dot)org
Subject: Type identification with libpq / PQFmod() when using aggregates (SUM)
Date: 2014-04-14 10:06:39
Message-ID: 534BB32F.4020503@4js.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-interfaces

Hello,

In a libpq client application, we need to properly identify the data type
when fetching data produced from a SELECT, therefore we use the PQftype()
and PQfmod() APIs ...

Consider a column defined with the following data type:

interval hour to second(0)

When executing a SELECT query using directly the columns values (no aggregate),
the libpq APIs (PQftype and PQfmod) return clear type information.

With an interval hour to second(0), we get:

PQftype() = 1186
PQfmode() = 469762048 (pgprec=7168, pgscal=65532, pgleng=469762044)

where precision, scale and length are computed as follows:

#define VARHDRSZ 4
int pgfmod = PQfmod(st->pgResult, i);
int pgprec = (pgfmod >> 16);
int pgscal = ((pgfmod - VARHDRSZ) & 0xffff);
int pgleng = (pgfmod - VARHDRSZ);

But when using an aggregate function like SUM(), PQfmode() function returns
"no information available" (-1) ...

Is the type of the result of an aggregate function (or even more complex
expressions) not known by the server?

Is this considered as bug or is it expected?

I found not much information in the PQfmod() description.

A workaround is to cast the result of the aggregate function:

SELECT CAST( SUM(mycol) AS INTERVAL HOUR TO SECOND(0) ) FROM ...

But I just wonder that the type of the result is not just the same as
the type of the source column...

Thanks!
Seb

Responses

Browse pgsql-interfaces by date

  From Date Subject
Next Message Tom Lane 2014-04-14 14:01:00 Re: Type identification with libpq / PQFmod() when using aggregates (SUM)
Previous Message למען העתיד 2014-04-11 17:46:16 הורה טוב יותר