mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-24 18:55:04 +08:00
Correctly handle NULLs in JSON output.
Error reported by David Wheeler.
This commit is contained in:
parent
b2ce60703a
commit
0c9e5d5e0d
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user