Skip to content
Snippets Groups Projects
  • Tom Lane's avatar
    784e762e
    Support multi-argument UNNEST(), and TABLE() syntax for multiple functions. · 784e762e
    Tom Lane authored
    This patch adds the ability to write TABLE( function1(), function2(), ...)
    as a single FROM-clause entry.  The result is the concatenation of the
    first row from each function, followed by the second row from each
    function, etc; with NULLs inserted if any function produces fewer rows than
    others.  This is believed to be a much more useful behavior than what
    Postgres currently does with multiple SRFs in a SELECT list.
    
    This syntax also provides a reasonable way to combine use of column
    definition lists with WITH ORDINALITY: put the column definition list
    inside TABLE(), where it's clear that it doesn't control the ordinality
    column as well.
    
    Also implement SQL-compliant multiple-argument UNNEST(), by turning
    UNNEST(a,b,c) into TABLE(unnest(a), unnest(b), unnest(c)).
    
    The SQL standard specifies TABLE() with only a single function, not
    multiple functions, and it seems to require an implicit UNNEST() which is
    not what this patch does.  There may be something wrong with that reading
    of the spec, though, because if it's right then the spec's TABLE() is just
    a pointless alternative spelling of UNNEST().  After further review of
    that, we might choose to adopt a different syntax for what this patch does,
    but in any case this functionality seems clearly worthwhile.
    
    Andrew Gierth, reviewed by Zoltán Böszörményi and Heikki Linnakangas, and
    significantly revised by me
    784e762e
    History
    Support multi-argument UNNEST(), and TABLE() syntax for multiple functions.
    Tom Lane authored
    This patch adds the ability to write TABLE( function1(), function2(), ...)
    as a single FROM-clause entry.  The result is the concatenation of the
    first row from each function, followed by the second row from each
    function, etc; with NULLs inserted if any function produces fewer rows than
    others.  This is believed to be a much more useful behavior than what
    Postgres currently does with multiple SRFs in a SELECT list.
    
    This syntax also provides a reasonable way to combine use of column
    definition lists with WITH ORDINALITY: put the column definition list
    inside TABLE(), where it's clear that it doesn't control the ordinality
    column as well.
    
    Also implement SQL-compliant multiple-argument UNNEST(), by turning
    UNNEST(a,b,c) into TABLE(unnest(a), unnest(b), unnest(c)).
    
    The SQL standard specifies TABLE() with only a single function, not
    multiple functions, and it seems to require an implicit UNNEST() which is
    not what this patch does.  There may be something wrong with that reading
    of the spec, though, because if it's right then the spec's TABLE() is just
    a pointless alternative spelling of UNNEST().  After further review of
    that, we might choose to adopt a different syntax for what this patch does,
    but in any case this functionality seems clearly worthwhile.
    
    Andrew Gierth, reviewed by Zoltán Böszörményi and Heikki Linnakangas, and
    significantly revised by me