mirror of
https://github.com/postgres/postgres.git
synced 2025-05-06 19:59:18 +03:00
This patch intrdocuces the SQL standard IS JSON predicate. It operates on text and bytea values representing JSON as well as on the json and jsonb types. Each test has an IS and IS NOT variant. The tests are: IS JSON [VALUE] IS JSON ARRAY IS JSON OBJECT IS JSON SCALAR IS JSON WITH | WITHOUT UNIQUE KEYS These are mostly self-explanatory, but note that IS JSON WITHOUT UNIQUE KEYS is true whenever IS JSON is true, and IS JSON WITH UNIQUE KEYS is true whenever IS JSON is true except it IS JSON OBJECT is true and there are duplicate keys (which is never the case when applied to jsonb values). Nikita Glukhov Reviewers have included (in no particular order) Andres Freund, Alexander Korotkov, Pavel Stehule, Andrew Alsup, Erik Rijkers, Zihong Yu, Himanshu Upadhyaya, Daniel Gustafsson, Justin Pryzby. Discussion: https://postgr.es/m/cd0bb935-0158-78a7-08b5-904886deac4b@postgrespro.ru
62 lines
2.2 KiB
C
62 lines
2.2 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* jsonfuncs.h
|
|
* Functions to process JSON data types.
|
|
*
|
|
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/utils/jsonfuncs.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef JSONFUNCS_H
|
|
#define JSONFUNCS_H
|
|
|
|
#include "common/jsonapi.h"
|
|
#include "utils/jsonb.h"
|
|
|
|
/*
|
|
* Flag types for iterate_json(b)_values to specify what elements from a
|
|
* json(b) document we want to iterate.
|
|
*/
|
|
typedef enum JsonToIndex
|
|
{
|
|
jtiKey = 0x01,
|
|
jtiString = 0x02,
|
|
jtiNumeric = 0x04,
|
|
jtiBool = 0x08,
|
|
jtiAll = jtiKey | jtiString | jtiNumeric | jtiBool
|
|
} JsonToIndex;
|
|
|
|
/* an action that will be applied to each value in iterate_json(b)_values functions */
|
|
typedef void (*JsonIterateStringValuesAction) (void *state, char *elem_value, int elem_len);
|
|
|
|
/* an action that will be applied to each value in transform_json(b)_values functions */
|
|
typedef text *(*JsonTransformStringValuesAction) (void *state, char *elem_value, int elem_len);
|
|
|
|
/* build a JsonLexContext from a text datum */
|
|
extern JsonLexContext *makeJsonLexContext(text *json, bool need_escapes);
|
|
|
|
/* try to parse json, and ereport(ERROR) on failure */
|
|
extern void pg_parse_json_or_ereport(JsonLexContext *lex, JsonSemAction *sem);
|
|
|
|
/* report an error during json lexing or parsing */
|
|
extern void json_ereport_error(JsonParseErrorType error, JsonLexContext *lex);
|
|
|
|
/* get first JSON token */
|
|
extern JsonTokenType json_get_first_token(text *json, bool throw_error);
|
|
|
|
extern uint32 parse_jsonb_index_flags(Jsonb *jb);
|
|
extern void iterate_jsonb_values(Jsonb *jb, uint32 flags, void *state,
|
|
JsonIterateStringValuesAction action);
|
|
extern void iterate_json_values(text *json, uint32 flags, void *action_state,
|
|
JsonIterateStringValuesAction action);
|
|
extern Jsonb *transform_jsonb_string_values(Jsonb *jsonb, void *action_state,
|
|
JsonTransformStringValuesAction transform_action);
|
|
extern text *transform_json_string_values(text *json, void *action_state,
|
|
JsonTransformStringValuesAction transform_action);
|
|
|
|
#endif
|