aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/json.c
diff options
context:
space:
mode:
authorAndrew Dunstan <andrew@dunslane.net>2012-02-23 23:44:16 -0500
committerAndrew Dunstan <andrew@dunslane.net>2012-02-23 23:44:16 -0500
commit0c9e5d5e0d407013bf66af01942a7b2dd3342546 (patch)
treea9c8b19589b958823c0a614e61c783f7a357c6e0 /src/backend/utils/adt/json.c
parentb2ce60703ab431a1d6c10f50587ea5f5e984af2e (diff)
downloadpostgresql-0c9e5d5e0d407013bf66af01942a7b2dd3342546.tar.gz
postgresql-0c9e5d5e0d407013bf66af01942a7b2dd3342546.zip
Correctly handle NULLs in JSON output.
Error reported by David Wheeler.
Diffstat (limited to 'src/backend/utils/adt/json.c')
-rw-r--r--src/backend/utils/adt/json.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
index d7db4cf0cf9..2968c57e3f8 100644
--- a/src/backend/utils/adt/json.c
+++ b/src/backend/utils/adt/json.c
@@ -79,9 +79,10 @@ static void report_parse_error(JsonParseStack *stack, JsonLexContext *lex);
static void report_invalid_token(JsonLexContext *lex);
static char *extract_mb_char(char *s);
static void composite_to_json(Datum composite, StringInfo result, bool use_line_feeds);
-static void array_dim_to_json(StringInfo result, int dim, int ndims,int * dims,
- Datum *vals, int * valcount, TYPCATEGORY tcategory,
- Oid typoutputfunc, bool use_line_feeds);
+static void array_dim_to_json(StringInfo result, int dim, int ndims, int *dims,
+ Datum *vals, bool *nulls, int *valcount,
+ TYPCATEGORY tcategory, Oid typoutputfunc,
+ bool use_line_feeds);
static void array_to_json_internal(Datum array, StringInfo result, bool use_line_feeds);
/* fake type category for JSON so we can distinguish it in datum_to_json */
@@ -682,13 +683,13 @@ extract_mb_char(char *s)
* composite_to_json or array_to_json_internal as appropriate.
*/
static inline void
-datum_to_json(Datum val, StringInfo result, TYPCATEGORY tcategory,
+datum_to_json(Datum val, bool is_null, StringInfo result, TYPCATEGORY tcategory,
Oid typoutputfunc)
{
char *outputstr;
- if (val == (Datum) NULL)
+ if (is_null)
{
appendStringInfoString(result,"null");
return;
@@ -742,8 +743,8 @@ datum_to_json(Datum val, StringInfo result, TYPCATEGORY tcategory,
*/
static void
array_dim_to_json(StringInfo result, int dim, int ndims,int * dims, Datum *vals,
- int * valcount, TYPCATEGORY tcategory, Oid typoutputfunc,
- bool use_line_feeds)
+ bool *nulls, int * valcount, TYPCATEGORY tcategory,
+ Oid typoutputfunc, bool use_line_feeds)
{
int i;
@@ -762,7 +763,8 @@ array_dim_to_json(StringInfo result, int dim, int ndims,int * dims, Datum *vals,
if (dim + 1 == ndims)
{
- datum_to_json(vals[*valcount],result,tcategory,typoutputfunc);
+ datum_to_json(vals[*valcount], nulls[*valcount], result, tcategory,
+ typoutputfunc);
(*valcount)++;
}
else
@@ -771,8 +773,8 @@ array_dim_to_json(StringInfo result, int dim, int ndims,int * dims, Datum *vals,
* Do we want line feeds on inner dimensions of arrays?
* For now we'll say no.
*/
- array_dim_to_json(result, dim+1, ndims, dims, vals, valcount,
- tcategory,typoutputfunc,false);
+ array_dim_to_json(result, dim+1, ndims, dims, vals, nulls,
+ valcount, tcategory, typoutputfunc, false);
}
}
@@ -827,7 +829,7 @@ array_to_json_internal(Datum array, StringInfo result, bool use_line_feeds)
else
tcategory = TypeCategory(element_type);
- array_dim_to_json(result, 0, ndim, dim, elements, &count, tcategory,
+ array_dim_to_json(result, 0, ndim, dim, elements, nulls, &count, tcategory,
typoutputfunc, use_line_feeds);
pfree(elements);
@@ -908,7 +910,7 @@ composite_to_json(Datum composite, StringInfo result, bool use_line_feeds)
else
val = origval;
- datum_to_json(val, result, tcategory, typoutput);
+ datum_to_json(val, isnull, result, tcategory, typoutput);
/* Clean up detoasted copy, if any */
if (val != origval)