Thread: Libpq: PQftype, PQfsize

Libpq: PQftype, PQfsize

From
"Bozena Potempa"
Date:
Hi,

I have a test table with varchar(40) column. After executing the following
query: 
select substr(fc,1,2) from test
PQftype returns for the result column PG_TYPE_TEXT and PQfsize returns -1. 
Is it the expected behaviour? The most suprising for me is PQfsize. 
Tested on PostgreSQL 8.4, 32-bit Windows.
Thank you in advance for explanations.

Bozena



Re: Libpq: PQftype, PQfsize

From
Tom Lane
Date:
"Bozena Potempa" <Bozena.Potempa@otc.pl> writes:
> I have a test table with varchar(40) column. After executing the following
> query: 
> select substr(fc,1,2) from test
> PQftype returns for the result column PG_TYPE_TEXT and PQfsize returns -1. 
> Is it the expected behaviour?

Yes.  substr() returns text.  But even if it returned varchar, you'd
probably get -1 for the fsize.  PG does not make any attempt to predict
the result width of functions.
        regards, tom lane


Re: Libpq: PQftype, PQfsize

From
"Bozena Potempa"
Date:
>From: Tom Lane [mailto:tgl@sss.pgh.pa.us] 
[..]
>"Bozena Potempa" <Bozena.Potempa@otc.pl> writes:
>> I have a test table with varchar(40) column. After executing the 
>> following
>> query: 
>> select substr(fc,1,2) from test
>> PQftype returns for the result column PG_TYPE_TEXT and 
>PQfsize returns -1. 
>> Is it the expected behaviour?
>
>Yes.  substr() returns text.  But even if it returned varchar, 
>you'd probably get -1 for the fsize.  PG does not make any 
>attempt to predict the result width of functions.

Thank you. In this case (substring) there is no much to predict, just a
simple calculation, but I understand that it is a part of larger and more
complicated functionality. I tried to find a workaround with a type cast: 
select substr(fc,1,2)::varchar(2) from test
Now the type returned is varchar, but the size is still -1. I think that it
is not a correct return: the size is specified explicitly in the query and
could be used by PQfsize. 

Bozena



Re: Libpq: PQftype, PQfsize

From
Tom Lane
Date:
"Bozena Potempa" <Bozena.Potempa@otc.pl> writes:
> Thank you. In this case (substring) there is no much to predict, just a
> simple calculation, but I understand that it is a part of larger and more
> complicated functionality. I tried to find a workaround with a type cast: 
> select substr(fc,1,2)::varchar(2) from test
> Now the type returned is varchar, but the size is still -1. I think that it
> is not a correct return: the size is specified explicitly in the query and
> could be used by PQfsize. 

Oh ... actually the problem there is that you have the wrong idea about
what PQfsize means.  What that returns is pg_type.typlen for the data
type, which is always going to be -1 for a varlena type like varchar.

The thing that you need to look at if you want to see information like
the max length of a varchar is typmod (PQfmod).  The typmod generally
has some funny datatype-specific encoding; for varchar and char it
works like this:-1: max length unknown or unspecifiedn>0: max length is n-4 characters
        regards, tom lane


Re: Libpq: PQftype, PQfsize

From
"Bozena Potempa"
Date:
 >From: Tom Lane [mailto:tgl@sss.pgh.pa.us] 
>> Thank you. In this case (substring) there is no much to 
>predict, just 
>> a simple calculation, but I understand that it is a part of 
>larger and 
>> more complicated functionality. I tried to find a workaround 
>with a type cast:
>> select substr(fc,1,2)::varchar(2) from test Now the type returned is 
>> varchar, but the size is still -1. I think that it is not a correct 
>> return: the size is specified explicitly in the query and could be 
>> used by PQfsize.
>
>Oh ... actually the problem there is that you have the wrong 
>idea about what PQfsize means.  What that returns is 
>pg_type.typlen for the data type, which is always going to be 
>-1 for a varlena type like varchar.
>
>The thing that you need to look at if you want to see 
>information like the max length of a varchar is typmod 
>(PQfmod).  The typmod generally has some funny 
>datatype-specific encoding; for varchar and char it works like this:
>    -1: max length unknown or unspecified
>    n>0: max length is n-4 characters

Thank you very much Tom. PQfmode returns the correct value when using a type
cast, so it solves my current problem. 
Perhaps you will implement the exact column size for querries with character
functions somwhere in the future. It is a nice feature, which is implemented
by Oracle or MS SQL Server.  Do not know about MySQL.

Regards,
Bozena Potempa