pgsql: Use standard casting mechanism to convert types in plpgsql, when - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Use standard casting mechanism to convert types in plpgsql, when
Date
Msg-id E1YTBmo-00030N-TH@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Use standard casting mechanism to convert types in plpgsql, when possible.

plpgsql's historical method for converting datatypes during assignments was
to apply the source type's output function and then the destination type's
input function.  Aside from being miserably inefficient in most cases, this
method failed outright in many cases where a user might expect it to work;
an example is that "declare x int; ... x := 3.9;" would fail, not round the
value to 4.

Instead, let's convert by applying the appropriate assignment cast whenever
there is one.  To avoid breaking compatibility unnecessarily, fall back to
the I/O conversion method if there is no assignment cast.

So far as I can tell, there is just one case where this method produces a
different result than the old code in a case where the old code would not
have thrown an error.  That is assignment of a boolean value to a string
variable (type text, varchar, or bpchar); the old way gave boolean's output
representation, ie 't'/'f', while the new way follows the behavior of the
bool-to-text cast and so gives 'true' or 'false'.  This will need to be
called out as an incompatibility in the 9.5 release notes.

Aside from handling many conversion cases more sanely, this method is
often significantly faster than the old way.  In part that's because
of more effective caching of the conversion info.

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/1345cc67bbb014209714af32b5681b1e11eaf964

Modified Files
--------------
doc/src/sgml/plpgsql.sgml    |   15 +-
doc/src/sgml/typeconv.sgml   |    7 +-
src/pl/plpgsql/src/pl_comp.c |    8 +-
src/pl/plpgsql/src/pl_exec.c |  333 ++++++++++++++++++++++++++++--------------
src/pl/plpgsql/src/plpgsql.h |    9 +-
5 files changed, 241 insertions(+), 131 deletions(-)


pgsql-committers by date:

Previous
From: Tom Lane
Date:
Subject: pgsql: Fix cost estimation for indexscans on expensive indexed expressi
Next
From: Tom Lane
Date:
Subject: pgsql: Need to special-case RECORD as well as UNKNOWN in plpgsql's cast