Re: FUNCTIONs and CASTs - Mailing list pgsql-sql

From Dean Gibson (DB Administrator)
Subject Re: FUNCTIONs and CASTs
Date
Msg-id 47B5D790.4090509@ultimeth.com
Whole thread Raw
In response to Re: FUNCTIONs and CASTs  (Richard Huxton <dev@archonet.com>)
Responses Re: FUNCTIONs and CASTs
List pgsql-sql
On 2008-02-15 01:38, Richard Huxton wrote:
> Dean Gibson (DB Administrator) wrote:
>> On 2008-02-14 15:19, Tom Lane wrote:
>>> It's not exactly clear what you checked, but it works as expected 
>>> for me.  See test case below, proving that indexscan works just fine 
>>> with a parameter declared using %type.
>>
>> Consider:
>>
>> CREATE TABLE zzz( aaa CHAR( 10 ) );
>>
>> CREATE FUNCTION dummy( zzz.aaa%TYPE ) RETURNS zzz.aaa%TYPE
>>    LANGUAGE SQL AS 'SELECT * FROM zzz WHERE CAST( $1 AS zzz.aaa%TYPE) 
>> = aaa';
>>
>> The notation "zzz.aaa%TYPE" fails when specified in the cast;  it's 
>> fine in the function prototype.  However, specifying it in the 
>> function prototype doesn't appear to help the performance issue:
>
> I get the same result: "works here".
>
>
>
> richardh=> CREATE OR REPLACE FUNCTION dummy2( zzz.aaa%TYPE ) RETURNS 
> zzz.aaa%TYPE
> richardh->    LANGUAGE SQL AS $$SELECT * FROM zzz WHERE aaa = $1 $$;
> NOTICE:  type reference zzz.aaa%TYPE converted to character
> NOTICE:  type reference zzz.aaa%TYPE converted to character
You REMOVED the CAST from the function definition.  Yes, if you do that, 
it works !!!


> Here is the actual function that caused be heartburn.  The types in 
> the function prototype match EXACTLY the types of the actual 
> parameters being passed (and I also tried it with the 
> tablename.columnname%TYPE notation), and yet this function is slow.  
> However, if I replace the "$1" in the function body with "CAST( $1 AS 
> CHAR( 10 ) )", the function is very fast.  Note that ALL of the column 
> names in the function below are indexed, so this function should be 
> very fast (and is, with the CASTs).
>
> Hang on though - this function isn't using %TYPE, it's using explicit 
> type definitions. If this function is slow, how can it be anything do 
> with %TYPE ?

Again, you are not understanding my point.  My point was that specifying 
tablename.columnname%TYPE notation doesn't help with the performance 
problem;  I have to explicitly cast the parameter in the body of the 
function.  Since I have to do that anyway, why use the 
tablename.columnname%TYPE notation?


>
>
>> I'm not asking for that as an enhancement; rather, I'm trying to 
>> understand what the tablename.columnname%TYPE notation accomplishes, 
>> since specifying it in the function prototype doesn't appear to 
>> accomplish anything (at least for me) over just specifying "TEXT".
>
> It specifies the type of the variable (or parameter) in question.
So?  What does that accomplish, over just using "TEXT"?

> The reason you can't use %TYPE directly in your SQL is because afaik 
> it's not SQL - it's a PostgreSQL extension designed to specify 
> variable types in functions. SQL constructs tend to expect a literal 
> type name.
>
> I'm not sure what your problem is, but it's not the %TYPE operator, 
> that's clear.

As I said, I don't have a problem with the function;  I modified it to 
work.  My point was, why use the tablename.columnname%TYPE notation when 
"TEXT" works just as well (for anything that converts to it)???


-- 
Mail to my list address MUST be sent via the mailing list.
All other mail to my list address will bounce.



pgsql-sql by date:

Previous
From: "Rodrigo E. De León Plicet"
Date:
Subject: Re: String function to Find how many times str2 is in str1?
Next
From: "Pavel Stehule"
Date:
Subject: Re: String function to Find how many times str2 is in str1?