From 3c000fd9a68dae9ebd9d1507ab3995cc178de1e5 Mon Sep 17 00:00:00 2001
From: Andrew Dunstan <andrew@dunslane.net>
Date: Mon, 4 May 2015 12:38:58 -0400
Subject: [PATCH] Fix two small bugs in json's populate_record_worker

The first bug is not releasing a tupdesc when doing an early return out
of the function. The second bug is a logic error in choosing when to do
an early return if given an empty jsonb object.

Bug reports from Pavel Stehule and Tom Lane respectively.

Backpatch to 9.4 where these were introduced.
---
 src/backend/utils/adt/jsonfuncs.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
index 274f64c95f8..5f61cfcb73a 100644
--- a/src/backend/utils/adt/jsonfuncs.c
+++ b/src/backend/utils/adt/jsonfuncs.c
@@ -2115,6 +2115,7 @@ populate_record_worker(FunctionCallInfo fcinfo, const char *funcname,
 		if (hash_get_num_entries(json_hash) == 0 && rec)
 		{
 			hash_destroy(json_hash);
+			ReleaseTupleDesc(tupdesc);
 			PG_RETURN_POINTER(rec);
 		}
 	}
@@ -2123,8 +2124,11 @@ populate_record_worker(FunctionCallInfo fcinfo, const char *funcname,
 		jb = PG_GETARG_JSONB(json_arg_num);
 
 		/* same logic as for json */
-		if (!have_record_arg && rec)
+		if (JB_ROOT_COUNT(jb) == 0 && rec)
+		{
+			ReleaseTupleDesc(tupdesc);
 			PG_RETURN_POINTER(rec);
+		}
 	}
 
 	ncolumns = tupdesc->natts;
-- 
GitLab