> david.g.johns...@gmail.com wrote:
> 
>> b...@yugabyte.com wrote:
>> 
>> create table s.t(k serial primary key, v text);
>> create function s.f(k_in in int)
>> select s.f(1);
> 
> text, function is now compiled with that type resolution fixed.
> I think mostly attributable to:
> 
> > The mutable nature of record variables presents another problem in this 
> > connection. When fields of a record variable are used in expressions or 
> > statements, the data types of the fields must not change from one call of 
> > the function to the next, since each expression will be analyzed using the 
> > data type that is present when the expression is first reached.
> 
> Though possibly… variable declarations [are] considered structural:
> 
> > The instruction tree fully translates the PL/pgSQL statement structure,
> 
>> drop table s.t cascade;
>> create table s.t(k serial primary key, v varchar(10));
>> select s.f(1);
> 
> still text as the compiled artifact is re-executed
>  
>> \c d0 d0$u0
>> select s.f(1);
> 
> now varchar as the function is recompiled during its first use in this 
> session.
> 
> Restarting everything is an approach to dealing with uncertainty. This 
> particular use case, though, isn't one that I'd be overly worried about. 
> Actually making DDL changes of this nature should be rare if not forbidden. 
> Once live on-the-fly column type changes just shouldn't happen so having a 
> plan in place that accommodates them is adding cost for no real benefit.

Thanks. I believe that you and I agree on the proper practice, paraphrased here 
slightly w.r.t. what I wrote in my point #6 in my email that started this 
thread:

Regard a DDL on any object that an application uses as unsafe while the app is 
in use. You must terminate all client-sessions before doing such a DDL and 
re-start them only when all such DDLs are done successfully.



Reply via email to