diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 19c2d6cab6..13c71af8f0 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -10317,7 +10317,7 @@ table2-mapping
Builds a JSON object out of a variadic argument list. By
convention, the argument list consists of alternating
- names and values.
+ keys and values.
json_build_object('foo',1,'bar',2)
{"foo": 1, "bar": 2}
@@ -10329,9 +10329,9 @@ table2-mapping
Builds a JSON object out of a text array. The array must have either
exactly one dimension with an even number of members, in which case
- they are taken as alternating name/value pairs, or two dimensions
+ they are taken as alternating key/value pairs, or two dimensions
such that each inner array has exactly two elements, which
- are taken as a name/value pair.
+ are taken as a key/value pair.
json_object('{a, 1, b, "def", c, 3.5}')>
json_object('{{a, 1},{b, "def"},{c, 3.5}}')>
@@ -10715,9 +10715,9 @@ table2-mapping
json_to_record> and json_to_recordset>,
type coercion from the JSON is best effort> and may not result
in desired values for some types. JSON keys are matched to
- identical field names in the target row type, and fields that do
- not exist in the JSON will simply be NULL. JSON keys that do not
- appear in the target row type will be omitted from the output.
+ identical column names in the target row type. JSON fields that do not
+ appear in the target row type will be omitted from the output, and
+ target columns that do not match any JSON field will simply be NULL.
diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
index 5bd39f5015..9216511931 100644
--- a/src/backend/utils/adt/json.c
+++ b/src/backend/utils/adt/json.c
@@ -354,8 +354,9 @@ static void
parse_object_field(JsonLexContext *lex, JsonSemAction *sem)
{
/*
- * an object field is "fieldname" : value where value can be a scalar,
- * object or array
+ * An object field is "fieldname" : value where value can be a scalar,
+ * object or array. Note: in user-facing docs and error messages, we
+ * generally call a field name a "key".
*/
char *fname = NULL; /* keep compiler quiet */
@@ -1890,7 +1891,6 @@ json_object_agg_transfn(PG_FUNCTION_ARGS)
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("field name must not be null")));
-
val_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
/*
@@ -1976,12 +1976,11 @@ json_build_object(PG_FUNCTION_ARGS)
StringInfo result;
Oid val_type;
-
if (nargs % 2 != 0)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("invalid number or arguments"),
- errhint("Object must be matched key value pairs.")));
+ errmsg("argument list must have even number of elements"),
+ errhint("The arguments of json_build_object() must consist of alternating keys and values.")));
result = makeStringInfo();
@@ -1989,7 +1988,6 @@ json_build_object(PG_FUNCTION_ARGS)
for (i = 0; i < nargs; i += 2)
{
-
/* process key */
if (PG_ARGISNULL(i))
@@ -2006,10 +2004,7 @@ json_build_object(PG_FUNCTION_ARGS)
if (val_type == UNKNOWNOID && get_fn_expr_arg_stable(fcinfo->flinfo, i))
{
val_type = TEXTOID;
- if (PG_ARGISNULL(i))
- arg = (Datum) 0;
- else
- arg = CStringGetTextDatum(PG_GETARG_POINTER(i));
+ arg = CStringGetTextDatum(PG_GETARG_POINTER(i));
}
else
{
@@ -2048,12 +2043,11 @@ json_build_object(PG_FUNCTION_ARGS)
errmsg("could not determine data type for argument %d",
i + 2)));
add_json(arg, PG_ARGISNULL(i + 1), result, val_type, false);
-
}
+
appendStringInfoChar(result, '}');
PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len));
-
}
/*
@@ -2127,9 +2121,8 @@ json_build_array_noargs(PG_FUNCTION_ARGS)
/*
* SQL function json_object(text[])
*
- * take a one or two dimensional array of text as name vale pairs
+ * take a one or two dimensional array of text as key/value pairs
* for a json object.
- *
*/
Datum
json_object(PG_FUNCTION_ARGS)
@@ -2219,7 +2212,7 @@ json_object(PG_FUNCTION_ARGS)
/*
* SQL function json_object(text[], text[])
*
- * take separate name and value arrays of text to construct a json object
+ * take separate key and value arrays of text to construct a json object
* pairwise.
*/
Datum
@@ -2299,7 +2292,6 @@ json_object_two_arg(PG_FUNCTION_ARGS)
pfree(result.data);
PG_RETURN_TEXT_P(rval);
-
}