postgres.git / summary / log / commit / refs

commit    a6991f763df8d2125ba2d53ef241bcdc6afc26cf
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Thu Jul 13 17:07:51 2023 +0000

    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 18ecd8cda6b..82734789dca 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))) [parent: 48582cf9ed96]