pgsql: Improve the handling of result type coercions in SQL functions.
Improve the handling of result type coercions in SQL functions.
Use the parser's standard type coercion machinery to convert the
output column(s) of a SQL function's final SELECT or RETURNING
to the type(s) they should have according to the function's declared
result type. We'll allow any case where an assignment-level
coercion is available. Previously, we failed unless the required
coercion was a binary-compatible one (and the documentation ignored
this, falsely claiming that the types must match exactly).
Notably, the coercion now accounts for typmods, so that cases where
a SQL function is declared to return a composite type whose columns
are typmod-constrained now behave as one would expect. Arguably
this aspect is a bug fix, but the overall behavioral change here
seems too large to consider back-patching.
A nice side-effect is that functions can now be inlined in a
few cases where we previously failed to do so because of type
mismatches.
Discussion: /messages/by-id/18929.1574895430@sss.pgh.pa.us
Branch
------
master
Details
-------
https://git.postgresql.org/pg/commitdiff/913bbd88dc6b859c70ebb48107b38d693c4c6673
Modified Files
--------------
doc/src/sgml/xfunc.sgml | 44 ++-
src/backend/catalog/pg_proc.c | 11 +-
src/backend/executor/functions.c | 508 ++++++++++++++++++-------------
src/backend/optimizer/util/clauses.c | 131 +++-----
src/include/executor/functions.h | 8 +-
src/test/regress/expected/rangefuncs.out | 210 ++++++++++++-
src/test/regress/sql/rangefuncs.sql | 76 ++++-
7 files changed, 656 insertions(+), 332 deletions(-)