• Tom Lane's avatar
    Use standard casting mechanism to convert types in plpgsql, when possible. · 1345cc67
    Tom Lane authored
    plpgsql's historical method for converting datatypes during assignments was
    to apply the source type's output function and then the destination type's
    input function.  Aside from being miserably inefficient in most cases, this
    method failed outright in many cases where a user might expect it to work;
    an example is that "declare x int; ... x := 3.9;" would fail, not round the
    value to 4.
    
    Instead, let's convert by applying the appropriate assignment cast whenever
    there is one.  To avoid breaking compatibility unnecessarily, fall back to
    the I/O conversion method if there is no assignment cast.
    
    So far as I can tell, there is just one case where this method produces a
    different result than the old code in a case where the old code would not
    have thrown an error.  That is assignment of a boolean value to a string
    variable (type text, varchar, or bpchar); the old way gave boolean's output
    representation, ie 't'/'f', while the new way follows the behavior of the
    bool-to-text cast and so gives 'true' or 'false'.  This will need to be
    called out as an incompatibility in the 9.5 release notes.
    
    Aside from handling many conversion cases more sanely, this method is
    often significantly faster than the old way.  In part that's because
    of more effective caching of the conversion info.
    1345cc67
plpgsql.sgml 195 KB