From a61f63df7d19006b36adf7ee402999aa5243097d Mon Sep 17 00:00:00 2001
From: Andrew Dunstan <andrew@dunslane.net>
Date: Tue, 22 Jul 2014 11:22:47 -0400
Subject: [PATCH] Allow empty string object keys in json_object().

This makes the behaviour consistent with the json parser, other
json-generating functions, and the JSON standards.
---
 src/backend/utils/adt/json.c         | 8 --------
 src/test/regress/expected/json.out   | 8 ++++++--
 src/test/regress/expected/json_1.out | 8 ++++++--
 src/test/regress/sql/json.sql        | 2 +-
 4 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
index 11c9135b48..8dd7a21fcf 100644
--- a/src/backend/utils/adt/json.c
+++ b/src/backend/utils/adt/json.c
@@ -2184,10 +2184,6 @@ json_object(PG_FUNCTION_ARGS)
 					 errmsg("null value not allowed for object key")));
 
 		v = TextDatumGetCString(in_datums[i * 2]);
-		if (v[0] == '\0')
-			ereport(ERROR,
-					(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
-					 errmsg("empty value not allowed for object key")));
 		if (i > 0)
 			appendStringInfoString(&result, ", ");
 		escape_json(&result, v);
@@ -2272,10 +2268,6 @@ json_object_two_arg(PG_FUNCTION_ARGS)
 					 errmsg("null value not allowed for object key")));
 
 		v = TextDatumGetCString(key_datums[i]);
-		if (v[0] == '\0')
-			ereport(ERROR,
-					(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
-					 errmsg("empty value not allowed for object key")));
 		if (i > 0)
 			appendStringInfoString(&result, ", ");
 		escape_json(&result, v);
diff --git a/src/test/regress/expected/json.out b/src/test/regress/expected/json.out
index cd6ea5b12d..de4d49d5b2 100644
--- a/src/test/regress/expected/json.out
+++ b/src/test/regress/expected/json.out
@@ -1213,9 +1213,13 @@ ERROR:  mismatched array dimensions
 -- null key error
 select json_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}');
 ERROR:  null value not allowed for object key
--- empty key error
+-- empty key is allowed
 select json_object('{a,b,"","d e f"}','{1,2,3,"a b c"}');
-ERROR:  empty value not allowed for object key
+                     json_object                     
+-----------------------------------------------------
+ {"a" : "1", "b" : "2", "" : "3", "d e f" : "a b c"}
+(1 row)
+
 -- json_to_record and json_to_recordset
 select * from json_to_record('{"a":1,"b":"foo","c":"bar"}')
     as x(a int, b text, d text);
diff --git a/src/test/regress/expected/json_1.out b/src/test/regress/expected/json_1.out
index 51657a8d70..2f8e8b0a9c 100644
--- a/src/test/regress/expected/json_1.out
+++ b/src/test/regress/expected/json_1.out
@@ -1209,9 +1209,13 @@ ERROR:  mismatched array dimensions
 -- null key error
 select json_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}');
 ERROR:  null value not allowed for object key
--- empty key error
+-- empty key is allowed
 select json_object('{a,b,"","d e f"}','{1,2,3,"a b c"}');
-ERROR:  empty value not allowed for object key
+                     json_object                     
+-----------------------------------------------------
+ {"a" : "1", "b" : "2", "" : "3", "d e f" : "a b c"}
+(1 row)
+
 -- json_to_record and json_to_recordset
 select * from json_to_record('{"a":1,"b":"foo","c":"bar"}')
     as x(a int, b text, d text);
diff --git a/src/test/regress/sql/json.sql b/src/test/regress/sql/json.sql
index 3215b61a5a..ae65ef6921 100644
--- a/src/test/regress/sql/json.sql
+++ b/src/test/regress/sql/json.sql
@@ -435,7 +435,7 @@ select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}');
 
 select json_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}');
 
--- empty key error
+-- empty key is allowed
 
 select json_object('{a,b,"","d e f"}','{1,2,3,"a b c"}');
 
-- 
2.49.0