• Tom Lane's avatar
    Restore json{b}_populate_record{set}'s ability to take type info from AS. · e136a0d8
    Tom Lane authored
    If the record argument is NULL and has no declared type more concrete
    than RECORD, we can't extract useful information about the desired
    rowtype from it.  In this case, see if we're in FROM with an AS clause,
    and if so extract the needed rowtype info from AS.
    
    It worked like this before v11, but commit 37a795a6 removed the
    behavior, reasoning that it was undocumented, inefficient, and utterly
    not self-consistent.  If you want to take type info from an AS clause,
    you should be using the json_to_record() family of functions not the
    json_populate_record() family.  Also, it was already the case that
    the "populate" functions would fail for a null-valued RECORD input
    (with an unfriendly "record type has not been registered" error)
    when there wasn't an AS clause at hand, and it wasn't obvious that
    that behavior wasn't OK when there was one.  However, it emerges
    that some people were depending on this to work, and indeed the
    rather off-point error message you got if you left off AS encouraged
    slapping on AS without switching to the json_to_record() family.
    
    Hence, put back the fallback behavior of looking for AS.  While at it,
    improve the run-time error you get when there's no place to obtain type
    info; we can do a lot better than "record type has not been registered".
    (We can't, unfortunately, easily improve the parse-time error message
    that leads people down this path in the first place.)
    
    While at it, I refactored the code a bit to avoid duplicating the
    same logic in several different places.
    
    Per bug #15940 from Jaroslav Sivy.  Back-patch to v11 where the
    current coding came in.  (The pre-v11 deficiencies in this area
    aren't regressions, so we'll leave those branches alone.)
    
    Patch by me, based on preliminary analysis by Dmitry Dolgov.
    
    Discussion: https://postgr.es/m/15940-2ab76dc58ffb85b6@postgresql.org
    e136a0d8
json.out 70.8 KB