mirror of https://github.com/postgres/postgres
e27f3f52c2
GiST compress functions (like all GiST opclass functions) are supposed to be called in short-lived memory contexts, so that minor memory leaks in them are not of concern, and indeed explicit pfree's are likely slightly counterproductive. But this one in g_intbig_compress() is more than slightly counterproductive, because it's guarded by "if (in != DatumGetArrayTypeP(entry->key))" which means that if this test succeeds, we've detoasted the datum twice. (And to add insult to injury, the extra detoast result is leaked.) Let's just drop the whole stanza, relying on the GiST temporary context mechanism to clean up in good time. The analogous bit in g_int_compress() is if (r != (ArrayType *) DatumGetPointer(entry->key)) pfree(r); which doesn't have the gratuitous-detoast problem so I left it alone. Perhaps there is a case for removing unnecessary pfree's more widely, but I'm not sure if it's worth the code churn. The potential extra decompress seems expensive enough to justify calling this a (minor) performance bug and back-patching. Konstantin Knizhnik, Matthias van de Meent, Tom Lane Discussion: https://postgr.es/m/CAEze2Wi86=DxErfvf+SCB2UKmU2amKOF60BKuJOX=w-RojRn0A@mail.gmail.com |
||
---|---|---|
.. | ||
bench | ||
data | ||
expected | ||
sql | ||
.gitignore | ||
Makefile | ||
_int.h | ||
_int_bool.c | ||
_int_gin.c | ||
_int_gist.c | ||
_int_op.c | ||
_int_selfuncs.c | ||
_int_tool.c | ||
_intbig_gist.c | ||
intarray--1.0--1.1.sql | ||
intarray--1.1--1.2.sql | ||
intarray--1.2--1.3.sql | ||
intarray--1.2.sql | ||
intarray--1.3--1.4.sql | ||
intarray--1.4--1.5.sql | ||
intarray.control | ||
meson.build |