Frank, thanks for educating me. 

        -- Korry

> -----Original Message-----
> From: Korry Douglas [mailto:korry.doug...@enterprisedb.com] 
> Sent: Sunday, January 09, 2011 2:34 PM
> To: frank
> Cc: 'Kevin Grittner'; pgsql-bugs@postgresql.org
> Subject: Re: [BUGS] BUG #5816: index not used in function
> 
>  
> 
> > We may have different perceptions of something being a 'bug'. I always
> 
> > have several simple ways of determining it. One of them is when a
> 
> > work-around is in the proposal. Yours is one.
> 
>  
> 
> It seems to me that the important question in this case is whether or not the 
> query produced the correct result.
> 
> The important question by nature is not whether correct result is produce 
> eventually. In this case, the important thing is the inability to use the 
> index when in fact, if designed and implemented correctly, it could.
> 
>  
> 
> You are complaining about a performance issue, not a correctness issue, right?
> 
> No. I am pointing out a low-level-design/implementation defect. Poor 
> performance is the symptom. Poor performance due to sub-optimal execution of 
> the spec is a correctness issue. (See my comment on the nature of a function 
> below)
> 
>  
> 
> Kevin's work-around is meant to help you *gain better performance*, not to 
> obtain correct results when you are getting incorrect results.
> 
> If it is not a bug, why do we need a work-around?
> 
>  
> 
> > There can be quite a number of ways of looking at the issue. First, it
> 
> > is truly an implementation matter (making it in the true sense a bug). I
> 
> > do not believe that the spec would in formal way say that 'well, there
> 
> > are caveats where you have to do this and that to work around'.
> 
>  
> 
> The "spec" (by which I assume you mean the SQL standard) says nothing about 
> which execution plan will be selected (by) the optimizer.
> 
> No. Whatever the spec, it will never say that a function will not work as a 
> function, or something that works outside one will not work once moved inside.
> 
>  
> 
> > <snip>
> 
> > If by 'kept from one execution to another' means that (the concept of) a
> 
> > plan is implemented static, this can be a low level design issue, which
> 
> > in general will still be regarded as implementation, thus a bug.
> 
>  
> 
> The execution plan is not quite static - it is computed the first time you 
> run the function (within a session) and is discarded when your session ends 
> (or when the compiled function/execution plan becomes obsolete because of a 
> change to a dependency).
> 
>  
> 
> That is by design.
> 
> Then the design is poor.
> 
>  
> 
> If you want a dynamic plan that is re-computed each time you execute the 
> query, you can get that behavior by using dynamic SQL, as Kevin suggested.
> 
>  
> 
> This seems far fetched and irrelevant. Whatever is truly static should be 
> implemented static; whatever is dynamic should be implemented dynamic; 
> whatever is partially static, the static part should be static and the 
> dynamic part should be dynamic. It is natural and correct treatment.
> 
>  
> 
> Purely dynamic situation in which the final query can not be determined in 
> any fashion, will have to be constructed either outside of the function or 
> within, so EXECUTE is the only way to handle. What do you think of requiring 
> the caller to construct such a static statement as “select count(*) from 
> sometable” and use EXECUTE?
> 
>  
> 
> By the same token, “select thiscolumn from thistable where upper(thiscolumn) 
> like $1” has to be treated statically for the static part. The only unknown 
> is the parameter, which can be, by the right design and implementation, 
> delayed till execution (runtime). The code to deal with this is what I 
> pointed out (via a conditional). If the plan is a piece of code, then the 
> conditional will be in it. If the plan is a piece of text to be further 
> interpreted for actual execution (why would one want to do it that way?), the 
> conditional could contain a text reference to two pieces of code (w/o the use 
> of the index). If it is not properly designed/implemented and such situation 
> results in the loss of the said ability, it is a defect to be addressed. 
> Whether one wants to address it is one issue. A defect is a defect.
> 
>  
> 
> You seem to suggest that the plan was only built at (the first) execution. 
> That is poor design/implementation.
> 
>  
> 
> Lastly, what is a function? One of the fundamental features of a function is 
> encapsulation. One is guaranteed some well-defined output based on 
> well-defined input. No implementation detail is necessary or is obliged to be 
> available. The user does not have to know what table or anything for that 
> matter is involved. When you push for what is suggested as a work-around, it 
> defeats one of the basic purposes for a function.
> 
>  
> 
> More can be said, but why one wants to defend a defect is quite beyond me.
> 
>  
> 
>                   -- Korry
> 

Reply via email to