Fix collation handling in plpgsql functions.
Tom Lane <tgl@sss.pgh.pa.us>
Fix collation handling in plpgsql functions. Make plpgsql treat the input collation as a polymorphism variable, so that we cache separate plans for each input collation that's used in a particular session, as per recent discussion. Propagate the input collation to all collatable input parameters. I chose to also propagate the input collation to all declared variables of collatable types, which is a bit more debatable but seems to be necessary for non-astonishing behavior. (Copying a parameter into a separate local variable shouldn't result in a change of behavior, for example.) There is enough infrastructure here to support declaring a collation for each local variable to override that default, but I thought we should wait to see what the field demand is before adding such a feature. In passing, remove exec_get_rec_fieldtype(), which wasn't used anywhere. Documentation patch to follow.
Files
| Path | Change | +/− |
|---|---|---|
| src/pl/plpgsql/src/gram.y | modified | +15 −6 |
| src/pl/plpgsql/src/pl_comp.c | modified | +71 −27 |
| src/pl/plpgsql/src/pl_exec.c | modified | +56 −23 |
| src/pl/plpgsql/src/plpgsql.h | modified | +14 −4 |
| src/test/regress/expected/collate.linux.utf8.out | modified | +43 −39 |
| src/test/regress/sql/collate.linux.utf8.sql | modified | +8 −3 |