diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
index 274f64c95f81c1d320f372aa62d6d0acc776428b..5f61cfcb73ae7f1510f489e91868b192f1336398 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;