Fix hash_array
authorPeter Eisentraut <peter@eisentraut.org>
Wed, 15 Sep 2021 09:59:34 +0000 (11:59 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Wed, 15 Sep 2021 10:15:04 +0000 (12:15 +0200)
Commit a3d2b1bbe904b0ca8d9fdde20f25295ff3e21f79 neglected to
initialize the type_id field of the synthesized type cache entry, so
it would make a new one on every call.

Also, better use the per-function memory context for this; otherwise
it leaks memory.

Discussion: https://www.postgresql.org/message-id/flat/17158-8a2ba823982537a4%40postgresql.org

src/backend/utils/adt/arrayfuncs.c

index bc2f30bae15d8cede8bac717097499e36fee197d..660e854e93f4d06faeedc8cd39a85c3589796afc 100644 (file)
@@ -3992,13 +3992,14 @@ hash_array(PG_FUNCTION_ARGS)
            MemoryContext oldcontext;
            TypeCacheEntry *record_typentry;
 
-           oldcontext = MemoryContextSwitchTo(CacheMemoryContext);
+           oldcontext = MemoryContextSwitchTo(fcinfo->flinfo->fn_mcxt);
 
            /*
             * Make fake type cache entry structure.  Note that we can't just
             * modify typentry, since that points directly into the type cache.
             */
-           record_typentry = palloc(sizeof(*record_typentry));
+           record_typentry = palloc0(sizeof(*record_typentry));
+           record_typentry->type_id = element_type;
 
            /* fill in what we need below */
            record_typentry->typlen = typentry->typlen;