From 7fffcc2ee9104787f8968c573ac4a5e19ddaf907 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 13 Jul 2023 13:07:51 -0400 Subject: [PATCH] Remove unnecessary pfree() in g_intbig_compress(). 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 --- contrib/intarray/_intbig_gist.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/contrib/intarray/_intbig_gist.c b/contrib/intarray/_intbig_gist.c index 67c44e99a9..104a4512d4 100644 --- a/contrib/intarray/_intbig_gist.c +++ b/contrib/intarray/_intbig_gist.c @@ -174,9 +174,6 @@ g_intbig_compress(PG_FUNCTION_ARGS) entry->rel, entry->page, entry->offset, false); - if (in != DatumGetArrayTypeP(entry->key)) - pfree(in); - PG_RETURN_POINTER(retval); } else if (!ISALLTRUE(DatumGetPointer(entry->key)))