ICU non-utf8 code path leaks memory like there's no tomorrow

Tom Lane <tgl@sss.pgh.pa.us>

From: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-hackers@postgreSQL.org
Date: 2017-06-23T01:36:38Z
Lists: pgsql-hackers
In a database with utf8 encoding, this behaves reasonably:

select count(*) from
(select * from generate_series(1,10000000) x
 order by x::text collate "en-x-icu") ss;

It eats circa 25MB, not a lot worse than the libc-collation equivalent.
But try it in say LATIN1, and it eats multiple gigabytes.

I believe the reason is that the code paths in varstr_cmp that make
use of icu_to_uchar() have forgotten to free the palloc'd output
of the latter.  I have not looked to see where else the users of
that and the reverse function made this mistake.

			regards, tom lane


Commits

  1. Fix memory leakage in ICU encoding conversion, and other code review.