Fix hash_array
authorPeter Eisentraut <[email protected]>
Wed, 15 Sep 2021 09:59:34 +0000 (11:59 +0200)
committerPeter Eisentraut <[email protected]>
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;