eval_const_expressions() can reduce a COALESCE, CASE, or NULLIF expression to one of its inputs. The input, however, does not necessarily expose the same typmod and collation as the expression it replaces. In particular, an explicit COLLATE clause on one input determines the collation of the whole expression, while the other inputs keep their own collations. If the expression was reduced to one of those other inputs, anything that relies on exprCollation(), such as sorting or grouping on the expression, would use the wrong collation and could produce wrong results. For CASE and NULLIF this is a long-standing oversight. For COALESCE it has become much easier to hit since commits931766aaeand10c4fe074, which reduce a COALESCE with a single surviving argument, or with a leading non-nullable argument, to that argument. To fix, apply applyRelabelType() to the replacement in these cases, so that it exposes the type, typmod, and collation of the expression it replaces. Back-patch to v19 only. The CASE and NULLIF cases exist in older branches too, but they are not back-patched further, given the lack of field reports and the fact that the fix visibly changes the typmod exposed by a reduced CASE expression. Reported-by: Shihao Zhong <zhong950419@gmail.com> Author: Shihao Zhong <zhong950419@gmail.com> Author: Richard Guo <guofenglinux@gmail.com> Discussion: https://postgr.es/m/CAGRkXqR7VXacmRP41UBaM5u4aseeCH5ECVmQgn_YS=L7=xdhTw@mail.gmail.com Backpatch-through: 19
PostgreSQL Database Management System
This directory contains the source code distribution of the PostgreSQL database management system.
PostgreSQL is an advanced object-relational database management system that supports an extended subset of the SQL standard, including transactions, foreign keys, subqueries, triggers, user-defined types and functions. This distribution also contains C language bindings.
Copyright and license information can be found in the file COPYRIGHT.
General documentation about this version of PostgreSQL can be found at https://www.postgresql.org/docs/devel/. In particular, information about building PostgreSQL from the source code can be found at https://www.postgresql.org/docs/devel/installation.html.
The latest version of this software, and related software, may be obtained at https://www.postgresql.org/download/. For more information look at our web site located at https://www.postgresql.org/.