• Andrew Gierth's avatar
    Postpone aggregate checks until after collation is assigned. · d16d4538
    Andrew Gierth authored
    Previously, parseCheckAggregates was run before
    assign_query_collations, but this causes problems if any expression
    has already had a collation assigned by some transform function (e.g.
    transformCaseExpr) before parseCheckAggregates runs. The differing
    collations would cause expressions not to be recognized as equal to
    the ones in the GROUP BY clause, leading to spurious errors about
    unaggregated column references.
    
    The result was that CASE expr WHEN val ... would fail when "expr"
    contained a GROUPING() expression or matched one of the group by
    expressions, and where collatable types were involved; whereas the
    supposedly identical CASE WHEN expr = val ... would succeed.
    
    Backpatch all the way; this appears to have been wrong ever since
    collations were introduced.
    
    Per report from Guillaume Lelarge, analysis and patch by me.
    
    Discussion: https://postgr.es/m/CAECtzeVSO_US8C2Khgfv54ZMUOBR4sWq+6_bLrETnWExHT=rFg@mail.gmail.com
    Discussion: https://postgr.es/m/87muo0k0c7.fsf@news-spur.riddles.org.uk
    d16d4538
aggregates.sql 30.9 KB