PostgreSQL Source Code git master
jsonfuncs.h File Reference
#include "common/jsonapi.h"
#include "nodes/nodes.h"
#include "utils/jsonb.h"
Include dependency graph for jsonfuncs.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define pg_parse_json_or_ereport(lex, sem)    (void) pg_parse_json_or_errsave(lex, sem, NULL)
 

Typedefs

typedef enum JsonToIndex JsonToIndex
 
typedef void(* JsonIterateStringValuesAction) (void *state, char *elem_value, int elem_len)
 
typedef text *(* JsonTransformStringValuesAction) (void *state, char *elem_value, int elem_len)
 

Enumerations

enum  JsonToIndex {
  jtiKey = 0x01 , jtiString = 0x02 , jtiNumeric = 0x04 , jtiBool = 0x08 ,
  jtiAll = jtiKey | jtiString | jtiNumeric | jtiBool
}
 
enum  JsonTypeCategory {
  JSONTYPE_NULL , JSONTYPE_BOOL , JSONTYPE_NUMERIC , JSONTYPE_DATE ,
  JSONTYPE_TIMESTAMP , JSONTYPE_TIMESTAMPTZ , JSONTYPE_JSON , JSONTYPE_JSONB ,
  JSONTYPE_ARRAY , JSONTYPE_COMPOSITE , JSONTYPE_CAST , JSONTYPE_OTHER
}
 

Functions

JsonLexContextmakeJsonLexContext (JsonLexContext *lex, text *json, bool need_escapes)
 
bool pg_parse_json_or_errsave (JsonLexContext *lex, const JsonSemAction *sem, struct Node *escontext)
 
void json_errsave_error (JsonParseErrorType error, JsonLexContext *lex, struct Node *escontext)
 
JsonTokenType json_get_first_token (text *json, bool throw_error)
 
uint32 parse_jsonb_index_flags (Jsonb *jb)
 
void iterate_jsonb_values (Jsonb *jb, uint32 flags, void *state, JsonIterateStringValuesAction action)
 
void iterate_json_values (text *json, uint32 flags, void *action_state, JsonIterateStringValuesAction action)
 
Jsonbtransform_jsonb_string_values (Jsonb *jsonb, void *action_state, JsonTransformStringValuesAction transform_action)
 
texttransform_json_string_values (text *json, void *action_state, JsonTransformStringValuesAction transform_action)
 
void json_categorize_type (Oid typoid, bool is_jsonb, JsonTypeCategory *tcategory, Oid *outfuncoid)
 
Datum datum_to_json (Datum val, JsonTypeCategory tcategory, Oid outfuncoid)
 
Datum datum_to_jsonb (Datum val, JsonTypeCategory tcategory, Oid outfuncoid)
 
Datum jsonb_from_text (text *js, bool unique_keys)
 
Datum json_populate_type (Datum json_val, Oid json_type, Oid typid, int32 typmod, void **cache, MemoryContext mcxt, bool *isnull, bool omit_quotes, Node *escontext)
 

Macro Definition Documentation

◆ pg_parse_json_or_ereport

#define pg_parse_json_or_ereport (   lex,
  sem 
)     (void) pg_parse_json_or_errsave(lex, sem, NULL)

Definition at line 47 of file jsonfuncs.h.

Typedef Documentation

◆ JsonIterateStringValuesAction

typedef void(* JsonIterateStringValuesAction) (void *state, char *elem_value, int elem_len)

Definition at line 35 of file jsonfuncs.h.

◆ JsonToIndex

typedef enum JsonToIndex JsonToIndex

◆ JsonTransformStringValuesAction

typedef text *(* JsonTransformStringValuesAction) (void *state, char *elem_value, int elem_len)

Definition at line 38 of file jsonfuncs.h.

Enumeration Type Documentation

◆ JsonToIndex

Enumerator
jtiKey 
jtiString 
jtiNumeric 
jtiBool 
jtiAll 

Definition at line 25 of file jsonfuncs.h.

26{
27 jtiKey = 0x01,
28 jtiString = 0x02,
29 jtiNumeric = 0x04,
30 jtiBool = 0x08,
JsonToIndex
Definition: jsonfuncs.h:26
@ jtiKey
Definition: jsonfuncs.h:27
@ jtiAll
Definition: jsonfuncs.h:31
@ jtiNumeric
Definition: jsonfuncs.h:29
@ jtiBool
Definition: jsonfuncs.h:30
@ jtiString
Definition: jsonfuncs.h:28

◆ JsonTypeCategory

Enumerator
JSONTYPE_NULL 
JSONTYPE_BOOL 
JSONTYPE_NUMERIC 
JSONTYPE_DATE 
JSONTYPE_TIMESTAMP 
JSONTYPE_TIMESTAMPTZ 
JSONTYPE_JSON 
JSONTYPE_JSONB 
JSONTYPE_ARRAY 
JSONTYPE_COMPOSITE 
JSONTYPE_CAST 
JSONTYPE_OTHER 

Definition at line 68 of file jsonfuncs.h.

69{
70 JSONTYPE_NULL, /* null, so we didn't bother to identify */
71 JSONTYPE_BOOL, /* boolean (built-in types only) */
72 JSONTYPE_NUMERIC, /* numeric (ditto) */
73 JSONTYPE_DATE, /* we use special formatting for datetimes */
76 JSONTYPE_JSON, /* JSON (and JSONB, if not is_jsonb) */
77 JSONTYPE_JSONB, /* JSONB (if is_jsonb) */
78 JSONTYPE_ARRAY, /* array */
79 JSONTYPE_COMPOSITE, /* composite */
80 JSONTYPE_CAST, /* something with an explicit cast to JSON */
81 JSONTYPE_OTHER, /* all else */
JsonTypeCategory
Definition: jsonfuncs.h:69
@ JSONTYPE_JSON
Definition: jsonfuncs.h:76
@ JSONTYPE_NULL
Definition: jsonfuncs.h:70
@ JSONTYPE_TIMESTAMP
Definition: jsonfuncs.h:74
@ JSONTYPE_NUMERIC
Definition: jsonfuncs.h:72
@ JSONTYPE_DATE
Definition: jsonfuncs.h:73
@ JSONTYPE_BOOL
Definition: jsonfuncs.h:71
@ JSONTYPE_OTHER
Definition: jsonfuncs.h:81
@ JSONTYPE_CAST
Definition: jsonfuncs.h:80
@ JSONTYPE_COMPOSITE
Definition: jsonfuncs.h:79
@ JSONTYPE_ARRAY
Definition: jsonfuncs.h:78
@ JSONTYPE_TIMESTAMPTZ
Definition: jsonfuncs.h:75
@ JSONTYPE_JSONB
Definition: jsonfuncs.h:77

Function Documentation

◆ datum_to_json()

Datum datum_to_json ( Datum  val,
JsonTypeCategory  tcategory,
Oid  outfuncoid 
)

Definition at line 763 of file json.c.

764{
765 StringInfo result = makeStringInfo();
766
767 datum_to_json_internal(val, false, result, tcategory, outfuncoid,
768 false);
769
770 return PointerGetDatum(cstring_to_text_with_len(result->data, result->len));
771}
long val
Definition: informix.c:689
static void datum_to_json_internal(Datum val, bool is_null, StringInfo result, JsonTypeCategory tcategory, Oid outfuncoid, bool key_scalar)
Definition: json.c:179
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:327
StringInfo makeStringInfo(void)
Definition: stringinfo.c:72
text * cstring_to_text_with_len(const char *s, int len)
Definition: varlena.c:196

References cstring_to_text_with_len(), StringInfoData::data, datum_to_json_internal(), StringInfoData::len, makeStringInfo(), PointerGetDatum(), and val.

Referenced by ExecEvalJsonConstructor(), and to_json().

◆ datum_to_jsonb()

Datum datum_to_jsonb ( Datum  val,
JsonTypeCategory  tcategory,
Oid  outfuncoid 
)

Definition at line 1112 of file jsonb.c.

1113{
1114 JsonbInState result;
1115
1116 memset(&result, 0, sizeof(JsonbInState));
1117
1118 datum_to_jsonb_internal(val, false, &result, tcategory, outfuncoid,
1119 false);
1120
1121 return JsonbPGetDatum(JsonbValueToJsonb(result.res));
1122}
static void datum_to_jsonb_internal(Datum val, bool is_null, JsonbInState *result, JsonTypeCategory tcategory, Oid outfuncoid, bool key_scalar)
Definition: jsonb.c:638
static Datum JsonbPGetDatum(const Jsonb *p)
Definition: jsonb.h:386
Jsonb * JsonbValueToJsonb(JsonbValue *val)
Definition: jsonb_util.c:92
JsonbValue * res
Definition: jsonb.c:31

References datum_to_jsonb_internal(), JsonbPGetDatum(), JsonbValueToJsonb(), JsonbInState::res, and val.

Referenced by ExecEvalJsonConstructor(), and to_jsonb().

◆ iterate_json_values()

void iterate_json_values ( text json,
uint32  flags,
void *  action_state,
JsonIterateStringValuesAction  action 
)

Definition at line 5709 of file jsonfuncs.c.

5711{
5712 JsonLexContext lex;
5715
5716 state->lex = makeJsonLexContext(&lex, json, true);
5717 state->action = action;
5718 state->action_state = action_state;
5719 state->flags = flags;
5720
5721 sem->semstate = state;
5724
5726 freeJsonLexContext(&lex);
5727}
void freeJsonLexContext(JsonLexContext *lex)
Definition: jsonapi.c:687
JsonLexContext * makeJsonLexContext(JsonLexContext *lex, text *json, bool need_escapes)
Definition: jsonfuncs.c:539
static JsonParseErrorType iterate_values_object_field_start(void *state, char *fname, bool isnull)
Definition: jsonfuncs.c:5762
static JsonParseErrorType iterate_values_scalar(void *state, char *token, JsonTokenType tokentype)
Definition: jsonfuncs.c:5734
#define pg_parse_json_or_ereport(lex, sem)
Definition: jsonfuncs.h:47
void * palloc0(Size size)
Definition: mcxt.c:1347
json_ofield_action object_field_start
Definition: jsonapi.h:158
json_scalar_action scalar
Definition: jsonapi.h:162
void * semstate
Definition: jsonapi.h:153
Definition: regguts.h:323
static JsonSemAction sem

References generate_unaccent_rules::action, freeJsonLexContext(), iterate_values_object_field_start(), iterate_values_scalar(), makeJsonLexContext(), JsonSemAction::object_field_start, palloc0(), pg_parse_json_or_ereport, JsonSemAction::scalar, sem, and JsonSemAction::semstate.

Referenced by json_to_tsvector_worker().

◆ iterate_jsonb_values()

void iterate_jsonb_values ( Jsonb jb,
uint32  flags,
void *  state,
JsonIterateStringValuesAction  action 
)

Definition at line 5641 of file jsonfuncs.c.

5643{
5644 JsonbIterator *it;
5645 JsonbValue v;
5647
5648 it = JsonbIteratorInit(&jb->root);
5649
5650 /*
5651 * Just recursively iterating over jsonb and call callback on all
5652 * corresponding elements
5653 */
5654 while ((type = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
5655 {
5656 if (type == WJB_KEY)
5657 {
5658 if (flags & jtiKey)
5659 action(state, v.val.string.val, v.val.string.len);
5660
5661 continue;
5662 }
5663 else if (!(type == WJB_VALUE || type == WJB_ELEM))
5664 {
5665 /* do not call callback for composite JsonbValue */
5666 continue;
5667 }
5668
5669 /* JsonbValue is a value of object or element of array */
5670 switch (v.type)
5671 {
5672 case jbvString:
5673 if (flags & jtiString)
5674 action(state, v.val.string.val, v.val.string.len);
5675 break;
5676 case jbvNumeric:
5677 if (flags & jtiNumeric)
5678 {
5679 char *val;
5680
5682 NumericGetDatum(v.val.numeric)));
5683
5684 action(state, val, strlen(val));
5685 pfree(val);
5686 }
5687 break;
5688 case jbvBool:
5689 if (flags & jtiBool)
5690 {
5691 if (v.val.boolean)
5692 action(state, "true", 4);
5693 else
5694 action(state, "false", 5);
5695 }
5696 break;
5697 default:
5698 /* do not call callback for composite JsonbValue */
5699 break;
5700 }
5701 }
5702}
Datum numeric_out(PG_FUNCTION_ARGS)
Definition: numeric.c:816
#define DirectFunctionCall1(func, arg1)
Definition: fmgr.h:641
@ jbvNumeric
Definition: jsonb.h:230
@ jbvBool
Definition: jsonb.h:231
@ jbvString
Definition: jsonb.h:229
JsonbIteratorToken
Definition: jsonb.h:21
@ WJB_KEY
Definition: jsonb.h:23
@ WJB_DONE
Definition: jsonb.h:22
@ WJB_VALUE
Definition: jsonb.h:24
@ WJB_ELEM
Definition: jsonb.h:25
JsonbIterator * JsonbIteratorInit(JsonbContainer *container)
Definition: jsonb_util.c:824
JsonbIteratorToken JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested)
Definition: jsonb_util.c:860
void pfree(void *pointer)
Definition: mcxt.c:1521
static Datum NumericGetDatum(Numeric X)
Definition: numeric.h:73
static char * DatumGetCString(Datum X)
Definition: postgres.h:340
enum jbvType type
Definition: jsonb.h:255
char * val
Definition: jsonb.h:264
JsonbContainer root
Definition: jsonb.h:215
const char * type

References generate_unaccent_rules::action, DatumGetCString(), DirectFunctionCall1, jbvBool, jbvNumeric, jbvString, JsonbIteratorInit(), JsonbIteratorNext(), jtiBool, jtiKey, jtiNumeric, jtiString, numeric_out(), NumericGetDatum(), pfree(), Jsonb::root, type, JsonbValue::type, JsonbValue::val, val, WJB_DONE, WJB_ELEM, WJB_KEY, and WJB_VALUE.

Referenced by jsonb_to_tsvector_worker().

◆ json_categorize_type()

void json_categorize_type ( Oid  typoid,
bool  is_jsonb,
JsonTypeCategory tcategory,
Oid outfuncoid 
)

Definition at line 5976 of file jsonfuncs.c.

5978{
5979 bool typisvarlena;
5980
5981 /* Look through any domain */
5982 typoid = getBaseType(typoid);
5983
5984 *outfuncoid = InvalidOid;
5985
5986 switch (typoid)
5987 {
5988 case BOOLOID:
5989 *outfuncoid = F_BOOLOUT;
5990 *tcategory = JSONTYPE_BOOL;
5991 break;
5992
5993 case INT2OID:
5994 case INT4OID:
5995 case INT8OID:
5996 case FLOAT4OID:
5997 case FLOAT8OID:
5998 case NUMERICOID:
5999 getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
6000 *tcategory = JSONTYPE_NUMERIC;
6001 break;
6002
6003 case DATEOID:
6004 *outfuncoid = F_DATE_OUT;
6005 *tcategory = JSONTYPE_DATE;
6006 break;
6007
6008 case TIMESTAMPOID:
6009 *outfuncoid = F_TIMESTAMP_OUT;
6010 *tcategory = JSONTYPE_TIMESTAMP;
6011 break;
6012
6013 case TIMESTAMPTZOID:
6014 *outfuncoid = F_TIMESTAMPTZ_OUT;
6015 *tcategory = JSONTYPE_TIMESTAMPTZ;
6016 break;
6017
6018 case JSONOID:
6019 getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
6020 *tcategory = JSONTYPE_JSON;
6021 break;
6022
6023 case JSONBOID:
6024 getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
6025 *tcategory = is_jsonb ? JSONTYPE_JSONB : JSONTYPE_JSON;
6026 break;
6027
6028 default:
6029 /* Check for arrays and composites */
6030 if (OidIsValid(get_element_type(typoid)) || typoid == ANYARRAYOID
6031 || typoid == ANYCOMPATIBLEARRAYOID || typoid == RECORDARRAYOID)
6032 {
6033 *outfuncoid = F_ARRAY_OUT;
6034 *tcategory = JSONTYPE_ARRAY;
6035 }
6036 else if (type_is_rowtype(typoid)) /* includes RECORDOID */
6037 {
6038 *outfuncoid = F_RECORD_OUT;
6039 *tcategory = JSONTYPE_COMPOSITE;
6040 }
6041 else
6042 {
6043 /*
6044 * It's probably the general case. But let's look for a cast
6045 * to json (note: not to jsonb even if is_jsonb is true), if
6046 * it's not built-in.
6047 */
6048 *tcategory = JSONTYPE_OTHER;
6049 if (typoid >= FirstNormalObjectId)
6050 {
6051 Oid castfunc;
6052 CoercionPathType ctype;
6053
6054 ctype = find_coercion_pathway(JSONOID, typoid,
6056 &castfunc);
6057 if (ctype == COERCION_PATH_FUNC && OidIsValid(castfunc))
6058 {
6059 *outfuncoid = castfunc;
6060 *tcategory = JSONTYPE_CAST;
6061 }
6062 else
6063 {
6064 /* non builtin type with no cast */
6065 getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
6066 }
6067 }
6068 else
6069 {
6070 /* any other builtin type */
6071 getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
6072 }
6073 }
6074 break;
6075 }
6076}
#define OidIsValid(objectId)
Definition: c.h:732
Oid get_element_type(Oid typid)
Definition: lsyscache.c:2786
bool type_is_rowtype(Oid typid)
Definition: lsyscache.c:2682
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
Definition: lsyscache.c:2934
Oid getBaseType(Oid typid)
Definition: lsyscache.c:2548
CoercionPathType find_coercion_pathway(Oid targetTypeId, Oid sourceTypeId, CoercionContext ccontext, Oid *funcid)
CoercionPathType
Definition: parse_coerce.h:25
@ COERCION_PATH_FUNC
Definition: parse_coerce.h:27
#define InvalidOid
Definition: postgres_ext.h:37
unsigned int Oid
Definition: postgres_ext.h:32
@ COERCION_EXPLICIT
Definition: primnodes.h:734
#define FirstNormalObjectId
Definition: transam.h:197

References COERCION_EXPLICIT, COERCION_PATH_FUNC, find_coercion_pathway(), FirstNormalObjectId, get_element_type(), getBaseType(), getTypeOutputInfo(), InvalidOid, JSONTYPE_ARRAY, JSONTYPE_BOOL, JSONTYPE_CAST, JSONTYPE_COMPOSITE, JSONTYPE_DATE, JSONTYPE_JSON, JSONTYPE_JSONB, JSONTYPE_NUMERIC, JSONTYPE_OTHER, JSONTYPE_TIMESTAMP, JSONTYPE_TIMESTAMPTZ, OidIsValid, and type_is_rowtype().

Referenced by add_json(), add_jsonb(), array_to_json_internal(), array_to_jsonb_internal(), composite_to_json(), composite_to_jsonb(), ExecInitExprRec(), json_agg_transfn_worker(), json_object_agg_transfn_worker(), jsonb_agg_transfn_worker(), jsonb_object_agg_transfn_worker(), to_json(), to_json_is_immutable(), to_jsonb(), and to_jsonb_is_immutable().

◆ json_errsave_error()

void json_errsave_error ( JsonParseErrorType  error,
JsonLexContext lex,
struct Node escontext 
)

Definition at line 640 of file jsonfuncs.c.

642{
646 errsave(escontext,
647 (errcode(ERRCODE_UNTRANSLATABLE_CHARACTER),
648 errmsg("unsupported Unicode escape sequence"),
650 report_json_context(lex)));
651 else if (error == JSON_SEM_ACTION_FAILED)
652 {
653 /* semantic action function had better have reported something */
654 if (!SOFT_ERROR_OCCURRED(escontext))
655 elog(ERROR, "JSON semantic action function did not provide error information");
656 }
657 else
658 errsave(escontext,
659 (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
660 errmsg("invalid input syntax for type %s", "json"),
662 report_json_context(lex)));
663}
int errdetail_internal(const char *fmt,...)
Definition: elog.c:1230
int errcode(int sqlerrcode)
Definition: elog.c:853
int errmsg(const char *fmt,...)
Definition: elog.c:1070
#define errsave(context,...)
Definition: elog.h:261
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
char * json_errdetail(JsonParseErrorType error, JsonLexContext *lex)
Definition: jsonapi.c:2401
@ JSON_SEM_ACTION_FAILED
Definition: jsonapi.h:59
@ JSON_UNICODE_CODE_POINT_ZERO
Definition: jsonapi.h:53
@ JSON_UNICODE_UNTRANSLATABLE
Definition: jsonapi.h:56
@ JSON_UNICODE_HIGH_ESCAPE
Definition: jsonapi.h:55
static int report_json_context(JsonLexContext *lex)
Definition: jsonfuncs.c:676
#define SOFT_ERROR_OCCURRED(escontext)
Definition: miscnodes.h:53
static void error(void)
Definition: sql-dyntest.c:147

References elog, errcode(), errdetail_internal(), errmsg(), ERROR, error(), errsave, json_errdetail(), JSON_SEM_ACTION_FAILED, JSON_UNICODE_CODE_POINT_ZERO, JSON_UNICODE_HIGH_ESCAPE, JSON_UNICODE_UNTRANSLATABLE, report_json_context(), and SOFT_ERROR_OCCURRED.

Referenced by get_array_start(), json_get_first_token(), json_typeof(), json_validate(), and pg_parse_json_or_errsave().

◆ json_get_first_token()

JsonTokenType json_get_first_token ( text json,
bool  throw_error 
)

Definition at line 5949 of file jsonfuncs.c.

5950{
5951 JsonLexContext lex;
5952 JsonParseErrorType result;
5953
5954 makeJsonLexContext(&lex, json, false);
5955
5956 /* Lex exactly one token from the input and check its type. */
5957 result = json_lex(&lex);
5958
5959 if (result == JSON_SUCCESS)
5960 return lex.token_type;
5961
5962 if (throw_error)
5963 json_errsave_error(result, &lex, NULL);
5964
5965 return JSON_TOKEN_INVALID; /* invalid json */
5966}
JsonParseErrorType json_lex(JsonLexContext *lex)
Definition: jsonapi.c:1588
JsonParseErrorType
Definition: jsonapi.h:35
@ JSON_SUCCESS
Definition: jsonapi.h:36
@ JSON_TOKEN_INVALID
Definition: jsonapi.h:19
void json_errsave_error(JsonParseErrorType error, JsonLexContext *lex, Node *escontext)
Definition: jsonfuncs.c:640
JsonTokenType token_type
Definition: jsonapi.h:109

References json_errsave_error(), json_lex(), JSON_SUCCESS, JSON_TOKEN_INVALID, makeJsonLexContext(), and JsonLexContext::token_type.

Referenced by ExecEvalJsonIsPredicate().

◆ json_populate_type()

Datum json_populate_type ( Datum  json_val,
Oid  json_type,
Oid  typid,
int32  typmod,
void **  cache,
MemoryContext  mcxt,
bool *  isnull,
bool  omit_quotes,
Node escontext 
)

Definition at line 3344 of file jsonfuncs.c.

3349{
3350 JsValue jsv = {0};
3351 JsonbValue jbv;
3352
3353 jsv.is_json = json_type == JSONOID;
3354
3355 if (*isnull)
3356 {
3357 if (jsv.is_json)
3358 jsv.val.json.str = NULL;
3359 else
3360 jsv.val.jsonb = NULL;
3361 }
3362 else if (jsv.is_json)
3363 {
3364 text *json = DatumGetTextPP(json_val);
3365
3366 jsv.val.json.str = VARDATA_ANY(json);
3367 jsv.val.json.len = VARSIZE_ANY_EXHDR(json);
3368 jsv.val.json.type = JSON_TOKEN_INVALID; /* not used in
3369 * populate_composite() */
3370 }
3371 else
3372 {
3373 Jsonb *jsonb = DatumGetJsonbP(json_val);
3374
3375 jsv.val.jsonb = &jbv;
3376
3377 if (omit_quotes)
3378 {
3379 char *str = JsonbUnquote(DatumGetJsonbP(json_val));
3380
3381 /* fill the quote-stripped string */
3382 jbv.type = jbvString;
3383 jbv.val.string.len = strlen(str);
3384 jbv.val.string.val = str;
3385 }
3386 else
3387 {
3388 /* fill binary jsonb value pointing to jb */
3389 jbv.type = jbvBinary;
3390 jbv.val.binary.data = &jsonb->root;
3391 jbv.val.binary.len = VARSIZE(jsonb) - VARHDRSZ;
3392 }
3393 }
3394
3395 if (*cache == NULL)
3396 *cache = MemoryContextAllocZero(mcxt, sizeof(ColumnIOData));
3397
3398 return populate_record_field(*cache, typid, typmod, NULL, mcxt,
3399 PointerGetDatum(NULL), &jsv, isnull,
3400 escontext, omit_quotes);
3401}
#define VARHDRSZ
Definition: c.h:649
#define DatumGetTextPP(X)
Definition: fmgr.h:292
const char * str
char * JsonbUnquote(Jsonb *jb)
Definition: jsonb.c:2229
@ jbvBinary
Definition: jsonb.h:236
static Jsonb * DatumGetJsonbP(Datum d)
Definition: jsonb.h:374
static Datum populate_record_field(ColumnIOData *col, Oid typid, int32 typmod, const char *colname, MemoryContext mcxt, Datum defaultval, JsValue *jsv, bool *isnull, Node *escontext, bool omit_scalar_quotes)
Definition: jsonfuncs.c:3405
void * MemoryContextAllocZero(MemoryContext context, Size size)
Definition: mcxt.c:1215
const char * str
Definition: jsonfuncs.c:299
JsonbValue * jsonb
Definition: jsonfuncs.c:304
struct JsValue::@25::@26 json
int len
Definition: jsonfuncs.c:300
union JsValue::@25 val
JsonTokenType type
Definition: jsonfuncs.c:301
bool is_json
Definition: jsonfuncs.c:294
Definition: jsonb.h:213
Definition: c.h:644
#define VARDATA_ANY(PTR)
Definition: varatt.h:324
#define VARSIZE(PTR)
Definition: varatt.h:279
#define VARSIZE_ANY_EXHDR(PTR)
Definition: varatt.h:317

References DatumGetJsonbP(), DatumGetTextPP, JsValue::is_json, jbvBinary, jbvString, JsValue::json, JSON_TOKEN_INVALID, JsValue::jsonb, JsonbUnquote(), JsValue::len, MemoryContextAllocZero(), PointerGetDatum(), populate_record_field(), Jsonb::root, JsValue::str, str, JsValue::type, JsonbValue::type, JsValue::val, JsonbValue::val, VARDATA_ANY, VARHDRSZ, VARSIZE, and VARSIZE_ANY_EXHDR.

Referenced by ExecEvalJsonCoercion().

◆ jsonb_from_text()

Datum jsonb_from_text ( text js,
bool  unique_keys 
)

Definition at line 147 of file jsonb.c.

148{
151 unique_keys,
152 NULL);
153}
static Datum jsonb_from_cstring(char *json, int len, bool unique_keys, Node *escontext)
Definition: jsonb.c:248

References jsonb_from_cstring(), VARDATA_ANY, and VARSIZE_ANY_EXHDR.

Referenced by ExecEvalJsonConstructor().

◆ makeJsonLexContext()

JsonLexContext * makeJsonLexContext ( JsonLexContext lex,
text json,
bool  need_escapes 
)

Definition at line 539 of file jsonfuncs.c.

540{
541 /*
542 * Most callers pass a detoasted datum, but it's not clear that they all
543 * do. pg_detoast_datum_packed() is cheap insurance.
544 */
545 json = pg_detoast_datum_packed(json);
546
548 VARDATA_ANY(json),
549 VARSIZE_ANY_EXHDR(json),
551 need_escapes);
552}
struct varlena * pg_detoast_datum_packed(struct varlena *datum)
Definition: fmgr.c:1864
JsonLexContext * makeJsonLexContextCstringLen(JsonLexContext *lex, const char *json, size_t len, int encoding, bool need_escapes)
Definition: jsonapi.c:392
int GetDatabaseEncoding(void)
Definition: mbutils.c:1261

References GetDatabaseEncoding(), makeJsonLexContextCstringLen(), pg_detoast_datum_packed(), VARDATA_ANY, and VARSIZE_ANY_EXHDR.

Referenced by datum_to_jsonb_internal(), each_worker(), elements_worker(), get_worker(), iterate_json_values(), json_array_length(), json_get_first_token(), json_in(), json_object_keys(), json_strip_nulls(), json_typeof(), json_validate(), populate_recordset_worker(), and transform_json_string_values().

◆ parse_jsonb_index_flags()

uint32 parse_jsonb_index_flags ( Jsonb jb)

Definition at line 5573 of file jsonfuncs.c.

5574{
5575 JsonbIterator *it;
5576 JsonbValue v;
5578 uint32 flags = 0;
5579
5580 it = JsonbIteratorInit(&jb->root);
5581
5582 type = JsonbIteratorNext(&it, &v, false);
5583
5584 /*
5585 * We iterate over array (scalar internally is represented as array, so,
5586 * we will accept it too) to check all its elements. Flag names are
5587 * chosen the same as jsonb_typeof uses.
5588 */
5589 if (type != WJB_BEGIN_ARRAY)
5590 ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5591 errmsg("wrong flag type, only arrays and scalars are allowed")));
5592
5593 while ((type = JsonbIteratorNext(&it, &v, false)) == WJB_ELEM)
5594 {
5595 if (v.type != jbvString)
5596 ereport(ERROR,
5597 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5598 errmsg("flag array element is not a string"),
5599 errhint("Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\".")));
5600
5601 if (v.val.string.len == 3 &&
5602 pg_strncasecmp(v.val.string.val, "all", 3) == 0)
5603 flags |= jtiAll;
5604 else if (v.val.string.len == 3 &&
5605 pg_strncasecmp(v.val.string.val, "key", 3) == 0)
5606 flags |= jtiKey;
5607 else if (v.val.string.len == 6 &&
5608 pg_strncasecmp(v.val.string.val, "string", 6) == 0)
5609 flags |= jtiString;
5610 else if (v.val.string.len == 7 &&
5611 pg_strncasecmp(v.val.string.val, "numeric", 7) == 0)
5612 flags |= jtiNumeric;
5613 else if (v.val.string.len == 7 &&
5614 pg_strncasecmp(v.val.string.val, "boolean", 7) == 0)
5615 flags |= jtiBool;
5616 else
5617 ereport(ERROR,
5618 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5619 errmsg("wrong flag in flag array: \"%s\"",
5620 pnstrdup(v.val.string.val, v.val.string.len)),
5621 errhint("Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\".")));
5622 }
5623
5624 /* expect end of array now */
5625 if (type != WJB_END_ARRAY)
5626 elog(ERROR, "unexpected end of flag array");
5627
5628 /* get final WJB_DONE and free iterator */
5629 type = JsonbIteratorNext(&it, &v, false);
5630 if (type != WJB_DONE)
5631 elog(ERROR, "unexpected end of flag array");
5632
5633 return flags;
5634}
uint32_t uint32
Definition: c.h:488
int errhint(const char *fmt,...)
Definition: elog.c:1317
#define ereport(elevel,...)
Definition: elog.h:149
@ WJB_END_ARRAY
Definition: jsonb.h:27
@ WJB_BEGIN_ARRAY
Definition: jsonb.h:26
char * pnstrdup(const char *in, Size len)
Definition: mcxt.c:1707
int pg_strncasecmp(const char *s1, const char *s2, size_t n)
Definition: pgstrcasecmp.c:69

References elog, ereport, errcode(), errhint(), errmsg(), ERROR, jbvString, JsonbIteratorInit(), JsonbIteratorNext(), jtiAll, jtiBool, jtiKey, jtiNumeric, jtiString, pg_strncasecmp(), pnstrdup(), Jsonb::root, type, JsonbValue::type, JsonbValue::val, WJB_BEGIN_ARRAY, WJB_DONE, WJB_ELEM, and WJB_END_ARRAY.

Referenced by json_to_tsvector(), json_to_tsvector_byid(), jsonb_to_tsvector(), and jsonb_to_tsvector_byid().

◆ pg_parse_json_or_errsave()

bool pg_parse_json_or_errsave ( JsonLexContext lex,
const JsonSemAction sem,
struct Node escontext 
)

Definition at line 518 of file jsonfuncs.c.

520{
521 JsonParseErrorType result;
522
523 result = pg_parse_json(lex, sem);
524 if (result != JSON_SUCCESS)
525 {
526 json_errsave_error(result, lex, escontext);
527 return false;
528 }
529 return true;
530}
JsonParseErrorType pg_parse_json(JsonLexContext *lex, const JsonSemAction *sem)
Definition: jsonapi.c:744

References json_errsave_error(), JSON_SUCCESS, pg_parse_json(), and sem.

Referenced by get_json_object_as_hash(), json_in(), jsonb_from_cstring(), and populate_array_json().

◆ transform_json_string_values()

text * transform_json_string_values ( text json,
void *  action_state,
JsonTransformStringValuesAction  transform_action 
)

Definition at line 5830 of file jsonfuncs.c.

5832{
5833 JsonLexContext lex;
5836
5837 state->lex = makeJsonLexContext(&lex, json, true);
5838 state->strval = makeStringInfo();
5839 state->action = transform_action;
5840 state->action_state = action_state;
5841
5842 sem->semstate = state;
5850
5852 freeJsonLexContext(&lex);
5853
5854 return cstring_to_text_with_len(state->strval->data, state->strval->len);
5855}
static JsonParseErrorType transform_string_values_array_start(void *state)
Definition: jsonfuncs.c:5883
static JsonParseErrorType transform_string_values_object_field_start(void *state, char *fname, bool isnull)
Definition: jsonfuncs.c:5903
static JsonParseErrorType transform_string_values_array_end(void *state)
Definition: jsonfuncs.c:5893
static JsonParseErrorType transform_string_values_object_end(void *state)
Definition: jsonfuncs.c:5873
static JsonParseErrorType transform_string_values_object_start(void *state)
Definition: jsonfuncs.c:5863
static JsonParseErrorType transform_string_values_array_element_start(void *state, bool isnull)
Definition: jsonfuncs.c:5921
static JsonParseErrorType transform_string_values_scalar(void *state, char *token, JsonTokenType tokentype)
Definition: jsonfuncs.c:5932
json_struct_action array_end
Definition: jsonapi.h:157
json_struct_action object_start
Definition: jsonapi.h:154
json_aelem_action array_element_start
Definition: jsonapi.h:160
json_struct_action array_start
Definition: jsonapi.h:156
json_struct_action object_end
Definition: jsonapi.h:155

References JsonSemAction::array_element_start, JsonSemAction::array_end, JsonSemAction::array_start, cstring_to_text_with_len(), freeJsonLexContext(), makeJsonLexContext(), makeStringInfo(), JsonSemAction::object_end, JsonSemAction::object_field_start, JsonSemAction::object_start, palloc0(), pg_parse_json_or_ereport, JsonSemAction::scalar, sem, JsonSemAction::semstate, transform_string_values_array_element_start(), transform_string_values_array_end(), transform_string_values_array_start(), transform_string_values_object_end(), transform_string_values_object_field_start(), transform_string_values_object_start(), and transform_string_values_scalar().

Referenced by ts_headline_json_byid_opt().

◆ transform_jsonb_string_values()

Jsonb * transform_jsonb_string_values ( Jsonb jsonb,
void *  action_state,
JsonTransformStringValuesAction  transform_action 
)

Definition at line 5783 of file jsonfuncs.c.

5785{
5786 JsonbIterator *it;
5787 JsonbValue v,
5788 *res = NULL;
5790 JsonbParseState *st = NULL;
5791 text *out;
5792 bool is_scalar = false;
5793
5794 it = JsonbIteratorInit(&jsonb->root);
5795 is_scalar = it->isScalar;
5796
5797 while ((type = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
5798 {
5799 if ((type == WJB_VALUE || type == WJB_ELEM) && v.type == jbvString)
5800 {
5801 out = transform_action(action_state, v.val.string.val, v.val.string.len);
5802 /* out is probably not toasted, but let's be sure */
5803 out = pg_detoast_datum_packed(out);
5804 v.val.string.val = VARDATA_ANY(out);
5805 v.val.string.len = VARSIZE_ANY_EXHDR(out);
5806 res = pushJsonbValue(&st, type, type < WJB_BEGIN_ARRAY ? &v : NULL);
5807 }
5808 else
5809 {
5810 res = pushJsonbValue(&st, type, (type == WJB_KEY ||
5811 type == WJB_VALUE ||
5812 type == WJB_ELEM) ? &v : NULL);
5813 }
5814 }
5815
5816 if (res->type == jbvArray)
5817 res->val.array.rawScalar = is_scalar;
5818
5819 return JsonbValueToJsonb(res);
5820}
@ jbvArray
Definition: jsonb.h:233
JsonbValue * pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq, JsonbValue *jbval)
Definition: jsonb_util.c:573
bool isScalar
Definition: jsonb.h:347

References JsonbIterator::isScalar, jbvArray, jbvString, JsonbIteratorInit(), JsonbIteratorNext(), JsonbValueToJsonb(), pg_detoast_datum_packed(), pushJsonbValue(), res, Jsonb::root, type, JsonbValue::type, JsonbValue::val, VARDATA_ANY, VARSIZE_ANY_EXHDR, WJB_BEGIN_ARRAY, WJB_DONE, WJB_ELEM, WJB_KEY, and WJB_VALUE.

Referenced by ts_headline_jsonb_byid_opt().