bool use_line_feeds);
static void array_to_json_internal(Datum array, StringInfo result,
bool use_line_feeds);
-static void datum_to_json(Datum val, bool is_null, StringInfo result,
- JsonTypeCategory tcategory, Oid outfuncoid,
- bool key_scalar);
+static void datum_to_json_internal(Datum val, bool is_null, StringInfo result,
+ JsonTypeCategory tcategory, Oid outfuncoid,
+ bool key_scalar);
static void add_json(Datum val, bool is_null, StringInfo result,
Oid val_type, bool key_scalar);
static text *catenate_stringinfo_string(StringInfo buffer, const char *addon);
* it's of an acceptable type, and force it to be quoted.
*/
static void
-datum_to_json(Datum val, bool is_null, StringInfo result,
- JsonTypeCategory tcategory, Oid outfuncoid,
- bool key_scalar)
+datum_to_json_internal(Datum val, bool is_null, StringInfo result,
+ JsonTypeCategory tcategory, Oid outfuncoid,
+ bool key_scalar)
{
char *outputstr;
text *jsontext;
if (dim + 1 == ndims)
{
- datum_to_json(vals[*valcount], nulls[*valcount], result, tcategory,
- outfuncoid, false);
+ datum_to_json_internal(vals[*valcount], nulls[*valcount],
+ result, tcategory,
+ outfuncoid, false);
(*valcount)++;
}
else
json_categorize_type(att->atttypid, false, &tcategory,
&outfuncoid);
- datum_to_json(val, isnull, result, tcategory, outfuncoid, false);
+ datum_to_json_internal(val, isnull, result, tcategory, outfuncoid,
+ false);
}
appendStringInfoChar(result, '}');
json_categorize_type(val_type, false,
&tcategory, &outfuncoid);
- datum_to_json(val, is_null, result, tcategory, outfuncoid, key_scalar);
+ datum_to_json_internal(val, is_null, result, tcategory, outfuncoid,
+ key_scalar);
}
/*
{
Datum val = PG_GETARG_DATUM(0);
Oid val_type = get_fn_expr_argtype(fcinfo->flinfo, 0);
- StringInfo result;
JsonTypeCategory tcategory;
Oid outfuncoid;
json_categorize_type(val_type, false,
&tcategory, &outfuncoid);
- result = makeStringInfo();
+ PG_RETURN_DATUM(datum_to_json(val, tcategory, outfuncoid));
+}
- datum_to_json(val, false, result, tcategory, outfuncoid, false);
+/*
+ * Turn a Datum into JSON text.
+ *
+ * tcategory and outfuncoid are from a previous call to json_categorize_type.
+ */
+Datum
+datum_to_json(Datum val, JsonTypeCategory tcategory, Oid outfuncoid)
+{
+ StringInfo result = makeStringInfo();
- PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len));
+ datum_to_json_internal(val, false, result, tcategory, outfuncoid,
+ false);
+
+ return PointerGetDatum(cstring_to_text_with_len(result->data, result->len));
}
/*
/* fast path for NULLs */
if (PG_ARGISNULL(1))
{
- datum_to_json((Datum) 0, true, state->str, JSONTYPE_NULL,
- InvalidOid, false);
+ datum_to_json_internal((Datum) 0, true, state->str, JSONTYPE_NULL,
+ InvalidOid, false);
PG_RETURN_POINTER(state);
}
appendStringInfoString(state->str, "\n ");
}
- datum_to_json(val, false, state->str, state->val_category,
- state->val_output_func, false);
+ datum_to_json_internal(val, false, state->str, state->val_category,
+ state->val_output_func, false);
/*
* The transition type for json_agg() is declared to be "internal", which
key_offset = out->len;
- datum_to_json(arg, false, out, state->key_category,
- state->key_output_func, true);
+ datum_to_json_internal(arg, false, out, state->key_category,
+ state->key_output_func, true);
if (unique_keys)
{
else
arg = PG_GETARG_DATUM(2);
- datum_to_json(arg, PG_ARGISNULL(2), state->str, state->val_category,
- state->val_output_func, false);
+ datum_to_json_internal(arg, PG_ARGISNULL(2), state->str,
+ state->val_category,
+ state->val_output_func, false);
PG_RETURN_POINTER(state);
}
Datum *vals, bool *nulls, int *valcount,
JsonTypeCategory tcategory, Oid outfuncoid);
static void array_to_jsonb_internal(Datum array, JsonbInState *result);
-static void datum_to_jsonb(Datum val, bool is_null, JsonbInState *result,
- JsonTypeCategory tcategory, Oid outfuncoid,
- bool key_scalar);
+static void datum_to_jsonb_internal(Datum val, bool is_null, JsonbInState *result,
+ JsonTypeCategory tcategory, Oid outfuncoid,
+ bool key_scalar);
static void add_jsonb(Datum val, bool is_null, JsonbInState *result,
Oid val_type, bool key_scalar);
static JsonbParseState *clone_parse_state(JsonbParseState *state);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
+/*
+ * jsonb_from_text
+ *
+ * Turns json text string into a jsonb Datum.
+ */
+Datum
+jsonb_from_text(text *js)
+{
+ return jsonb_from_cstring(VARDATA_ANY(js),
+ VARSIZE_ANY_EXHDR(js),
+ NULL);
+}
+
/*
* Get the type name of a jsonb container.
*/
* will be thrown.
*/
static void
-datum_to_jsonb(Datum val, bool is_null, JsonbInState *result,
- JsonTypeCategory tcategory, Oid outfuncoid,
- bool key_scalar)
+datum_to_jsonb_internal(Datum val, bool is_null, JsonbInState *result,
+ JsonTypeCategory tcategory, Oid outfuncoid,
+ bool key_scalar)
{
char *outputstr;
bool numeric_error;
{
if (dim + 1 == ndims)
{
- datum_to_jsonb(vals[*valcount], nulls[*valcount], result, tcategory,
- outfuncoid, false);
+ datum_to_jsonb_internal(vals[*valcount], nulls[*valcount], result, tcategory,
+ outfuncoid, false);
(*valcount)++;
}
else
json_categorize_type(att->atttypid, true, &tcategory,
&outfuncoid);
- datum_to_jsonb(val, isnull, result, tcategory, outfuncoid, false);
+ datum_to_jsonb_internal(val, isnull, result, tcategory, outfuncoid,
+ false);
}
result->res = pushJsonbValue(&result->parseState, WJB_END_OBJECT, NULL);
json_categorize_type(val_type, true,
&tcategory, &outfuncoid);
- datum_to_jsonb(val, is_null, result, tcategory, outfuncoid, key_scalar);
+ datum_to_jsonb_internal(val, is_null, result, tcategory, outfuncoid,
+ key_scalar);
}
+
/*
* Is the given type immutable when coming out of a JSONB context?
*
{
Datum val = PG_GETARG_DATUM(0);
Oid val_type = get_fn_expr_argtype(fcinfo->flinfo, 0);
- JsonbInState result;
JsonTypeCategory tcategory;
Oid outfuncoid;
json_categorize_type(val_type, true,
&tcategory, &outfuncoid);
+ PG_RETURN_DATUM(datum_to_jsonb(val, tcategory, outfuncoid));
+}
+
+/*
+ * Turn a Datum into jsonb.
+ *
+ * tcategory and outfuncoid are from a previous call to json_categorize_type.
+ */
+Datum
+datum_to_jsonb(Datum val, JsonTypeCategory tcategory, Oid outfuncoid)
+{
+ JsonbInState result;
+
memset(&result, 0, sizeof(JsonbInState));
- datum_to_jsonb(val, false, &result, tcategory, outfuncoid, false);
+ datum_to_jsonb_internal(val, false, &result, tcategory, outfuncoid,
+ false);
- PG_RETURN_POINTER(JsonbValueToJsonb(result.res));
+ return JsonbPGetDatum(JsonbValueToJsonb(result.res));
}
Datum
memset(&elem, 0, sizeof(JsonbInState));
- datum_to_jsonb(val, PG_ARGISNULL(1), &elem, state->val_category,
- state->val_output_func, false);
+ datum_to_jsonb_internal(val, PG_ARGISNULL(1), &elem, state->val_category,
+ state->val_output_func, false);
jbelem = JsonbValueToJsonb(elem.res);
memset(&elem, 0, sizeof(JsonbInState));
- datum_to_jsonb(val, false, &elem, state->key_category,
- state->key_output_func, true);
+ datum_to_jsonb_internal(val, false, &elem, state->key_category,
+ state->key_output_func, true);
jbkey = JsonbValueToJsonb(elem.res);
memset(&elem, 0, sizeof(JsonbInState));
- datum_to_jsonb(val, PG_ARGISNULL(2), &elem, state->val_category,
- state->val_output_func, false);
+ datum_to_jsonb_internal(val, PG_ARGISNULL(2), &elem, state->val_category,
+ state->val_output_func, false);
jbval = JsonbValueToJsonb(elem.res);
extern void json_categorize_type(Oid typoid, bool is_jsonb,
JsonTypeCategory *tcategory, Oid *outfuncoid);
+extern Datum datum_to_json(Datum val, JsonTypeCategory tcategory,
+ Oid outfuncoid);
+extern Datum datum_to_jsonb(Datum val, JsonTypeCategory tcategory,
+ Oid outfuncoid);
+extern Datum jsonb_from_text(text *js);
#endif