• Tom Lane's avatar
    Fix plpgsql to re-look-up composite type names at need. · fe9b7b2f
    Tom Lane authored
    Commit 4b93f579 rearranged things in plpgsql to make it cope better with
    composite types changing underneath it intra-session.  However, I failed to
    consider the case of a composite type being dropped and recreated entirely.
    In my defense, the previous coding didn't consider that possibility at all
    either --- but it would accidentally work so long as you didn't change the
    type's field list, because the built-at-compile-time list of component
    variables would then still match the type's new definition.  The new
    coding, however, occasionally tries to re-look-up the type by OID, and
    then fails to find the dropped type.
    
    To fix this, we need to save the TypeName struct, and then redo the type
    OID lookup from that.  Of course that's expensive, so we don't want to do
    it every time we need the type OID.  This can be fixed in the same way that
    4b93f579 dealt with changes to composite types' definitions: keep an eye
    on the type's typcache entry to see if its tupledesc has been invalidated.
    (Perhaps, at some point, this mechanism should be generalized so it can
    work for non-composite types too; but for now, plpgsql only tries to
    cope with intra-session redefinitions of composites.)
    
    I'm slightly hesitant to back-patch this into v11, because it changes
    the contents of struct PLpgSQL_type as well as the signature of
    plpgsql_build_datatype(), so in principle it could break code that is
    poking into the innards of plpgsql.  However, the only popular extension
    of that ilk is pldebugger, and it doesn't seem to be affected.  Since
    this is a regression for people who were relying on the old behavior,
    it seems worth taking the small risk of causing compatibility issues.
    
    Per bug #15913 from Daniel Fiori.  Back-patch to v11 where 4b93f579
    came in.
    
    Discussion: https://postgr.es/m/15913-a7e112e16dedcffc@postgresql.org
    fe9b7b2f
typcache.c 81.1 KB