7#include "utils/fmgrprotos.h"
11 .
name =
"jsonb_plperl",
75 if (v.
val.array.rawScalar)
82 elog(
ERROR,
"unexpected jsonb token: %d", r);
96 return newRV((SV *)
av);
115 v.
val.string.val, v.
val.string.len,
121 return newRV((SV *) hv);
125 elog(
ERROR,
"unexpected jsonb token: %d", r);
134 SSize_t pcount = av_len(in) + 1;
139 for (
i = 0;
i < pcount;
i++)
141 SV **
value = av_fetch(in,
i, FALSE);
163 (void) hv_iterinit(obj);
165 while ((
val = hv_iternextsv(obj, &kstr, &klen)))
168 key.val.string.len = klen;
225 double nval = SvNV(in);
235 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
236 errmsg(
"cannot convert infinity to jsonb")));
239 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
240 errmsg(
"cannot convert NaN to jsonb")));
251 out.
val.string.len = strlen(out.
val.string.val);
260 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
261 errmsg(
"cannot transform this Perl type to jsonb")));
Datum float8_numeric(PG_FUNCTION_ARGS)
Numeric int64_to_numeric(int64 val)
Datum numeric_out(PG_FUNCTION_ARGS)
Datum numeric_in(PG_FUNCTION_ARGS)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
Datum Float8GetDatum(float8 X)
#define PG_GETARG_POINTER(n)
#define DirectFunctionCall1(func, arg1)
#define DirectFunctionCall3(func, arg1, arg2, arg3)
#define PG_RETURN_JSONB_P(x)
#define PG_GETARG_JSONB_P(x)
static SV * JsonbValue_to_SV(JsonbValue *jbv)
static SV * Jsonb_to_SV(JsonbContainer *jsonb)
PG_FUNCTION_INFO_V1(jsonb_to_plperl)
static JsonbValue * HV_to_JsonbValue(HV *obj, JsonbParseState **jsonb_state)
static JsonbValue * SV_to_JsonbValue(SV *obj, JsonbParseState **ps, bool is_elem)
Datum jsonb_to_plperl(PG_FUNCTION_ARGS)
static JsonbValue * AV_to_JsonbValue(AV *in, JsonbParseState **jsonb_state)
Datum plperl_to_jsonb(PG_FUNCTION_ARGS)
PG_MODULE_MAGIC_EXT(.name="jsonb_plperl",.version=PG_VERSION)
JsonbValue * pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq, JsonbValue *jbval)
JsonbIterator * JsonbIteratorInit(JsonbContainer *container)
JsonbIteratorToken JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested)
Jsonb * JsonbValueToJsonb(JsonbValue *val)
void pfree(void *pointer)
char * pnstrdup(const char *in, Size len)
static Numeric DatumGetNumeric(Datum X)
static Datum NumericGetDatum(Numeric X)
static char * sv2cstr(SV *sv)
static SV * cstr2sv(const char *str)
static Datum PointerGetDatum(const void *X)
static Datum ObjectIdGetDatum(Oid X)
static char * DatumGetCString(Datum X)
static Datum CStringGetDatum(const char *X)
static Datum Int32GetDatum(int32 X)