static void ereport_op_str(const char *op, Jsonb *l, Jsonb *r) { const char *msgfmt; const char *lstr; const char *rstr; AssertArg(r != NULL); if (l == NULL) { msgfmt = "invalid expression: %s%s%s"; lstr = ""; } else { msgfmt = "invalid expression: %s %s %s"; lstr = JsonbToCString(NULL, &l->root, VARSIZE(l)); } rstr = JsonbToCString(NULL, &r->root, VARSIZE(r)); ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg(msgfmt, lstr, op, rstr))); }
static Datum jsonb_num(Jsonb *j, PGFunction f) { const char *type; if (f == numeric_int8) type = "int8"; else if (f == numeric_int4) type = "int4"; else if (f == numeric_float8) type = "float8"; else elog(ERROR, "unexpected type"); if (JB_ROOT_IS_SCALAR(j)) { JsonbValue *jv; jv = getIthJsonbValueFromContainer(&j->root, 0); if (jv->type == jbvNumeric) { Datum n; n = DirectFunctionCall1(f, NumericGetDatum(jv->val.numeric)); return n; } } ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("%s cannot be converted to %s", JsonbToCString(NULL, &j->root, VARSIZE(j)), type))); return 0; }
/* * jsonb type output function */ Datum jsonb_out(PG_FUNCTION_ARGS) { Jsonb *jb = PG_GETARG_JSONB(0); char *out; out = JsonbToCString(NULL, VARDATA(jb), VARSIZE(jb)); PG_RETURN_CSTRING(out); }
/* * jsonb type send function * * Just send jsonb as a version number, then a string of text */ Datum jsonb_send(PG_FUNCTION_ARGS) { Jsonb *jb = PG_GETARG_JSONB(0); StringInfoData buf; StringInfo jtext = makeStringInfo(); int version = 1; (void) JsonbToCString(jtext, VARDATA(jb), VARSIZE(jb)); pq_begintypsend(&buf); pq_sendint(&buf, version, 1); pq_sendtext(&buf, jtext->data, jtext->len); pfree(jtext->data); pfree(jtext); PG_RETURN_BYTEA_P(pq_endtypsend(&buf)); }
Datum jsonb_numeric(PG_FUNCTION_ARGS) { Jsonb *j = PG_GETARG_JSONB(0); if (JB_ROOT_IS_SCALAR(j)) { JsonbValue *jv; jv = getIthJsonbValueFromContainer(&j->root, 0); if (jv->type == jbvNumeric) PG_RETURN_DATUM(datumCopy(NumericGetDatum(jv->val.numeric), false, -1)); } ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("%s cannot be converted to numeric", JsonbToCString(NULL, &j->root, VARSIZE(j))))); PG_RETURN_NULL(); }