@ -42,113 +42,6 @@
# define JB_PATH_CREATE_OR_INSERT \
( JB_PATH_INSERT_BEFORE | JB_PATH_INSERT_AFTER | JB_PATH_CREATE )
/* semantic action functions for json_object_keys */
static void okeys_object_field_start ( void * state , char * fname , bool isnull ) ;
static void okeys_array_start ( void * state ) ;
static void okeys_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
/* semantic action functions for json_get* functions */
static void get_object_start ( void * state ) ;
static void get_object_end ( void * state ) ;
static void get_object_field_start ( void * state , char * fname , bool isnull ) ;
static void get_object_field_end ( void * state , char * fname , bool isnull ) ;
static void get_array_start ( void * state ) ;
static void get_array_end ( void * state ) ;
static void get_array_element_start ( void * state , bool isnull ) ;
static void get_array_element_end ( void * state , bool isnull ) ;
static void get_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
/* common worker function for json getter functions */
static Datum get_path_all ( FunctionCallInfo fcinfo , bool as_text ) ;
static text * get_worker ( text * json , char * * tpath , int * ipath , int npath ,
bool normalize_results ) ;
static Datum get_jsonb_path_all ( FunctionCallInfo fcinfo , bool as_text ) ;
/* semantic action functions for json_array_length */
static void alen_object_start ( void * state ) ;
static void alen_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
static void alen_array_element_start ( void * state , bool isnull ) ;
/* common workers for json{b}_each* functions */
static Datum each_worker ( FunctionCallInfo fcinfo , bool as_text ) ;
static Datum each_worker_jsonb ( FunctionCallInfo fcinfo , const char * funcname ,
bool as_text ) ;
/* semantic action functions for json_each */
static void each_object_field_start ( void * state , char * fname , bool isnull ) ;
static void each_object_field_end ( void * state , char * fname , bool isnull ) ;
static void each_array_start ( void * state ) ;
static void each_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
/* common workers for json{b}_array_elements_* functions */
static Datum elements_worker ( FunctionCallInfo fcinfo , const char * funcname ,
bool as_text ) ;
static Datum elements_worker_jsonb ( FunctionCallInfo fcinfo , const char * funcname ,
bool as_text ) ;
/* semantic action functions for json_array_elements */
static void elements_object_start ( void * state ) ;
static void elements_array_element_start ( void * state , bool isnull ) ;
static void elements_array_element_end ( void * state , bool isnull ) ;
static void elements_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
/* turn a json object into a hash table */
static HTAB * get_json_object_as_hash ( text * json , const char * funcname ) ;
/* common worker for populate_record and to_record */
static Datum populate_record_worker ( FunctionCallInfo fcinfo , const char * funcname ,
bool have_record_arg ) ;
/* semantic action functions for get_json_object_as_hash */
static void hash_object_field_start ( void * state , char * fname , bool isnull ) ;
static void hash_object_field_end ( void * state , char * fname , bool isnull ) ;
static void hash_array_start ( void * state ) ;
static void hash_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
/* semantic action functions for populate_recordset */
static void populate_recordset_object_field_start ( void * state , char * fname , bool isnull ) ;
static void populate_recordset_object_field_end ( void * state , char * fname , bool isnull ) ;
static void populate_recordset_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
static void populate_recordset_object_start ( void * state ) ;
static void populate_recordset_object_end ( void * state ) ;
static void populate_recordset_array_start ( void * state ) ;
static void populate_recordset_array_element_start ( void * state , bool isnull ) ;
/* semantic action functions for json_strip_nulls */
static void sn_object_start ( void * state ) ;
static void sn_object_end ( void * state ) ;
static void sn_array_start ( void * state ) ;
static void sn_array_end ( void * state ) ;
static void sn_object_field_start ( void * state , char * fname , bool isnull ) ;
static void sn_array_element_start ( void * state , bool isnull ) ;
static void sn_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
/* worker function for populate_recordset and to_recordset */
static Datum populate_recordset_worker ( FunctionCallInfo fcinfo , const char * funcname ,
bool have_record_arg ) ;
/* Worker that takes care of common setup for us */
static JsonbValue * findJsonbValueFromContainerLen ( JsonbContainer * container ,
uint32 flags ,
char * key ,
uint32 keylen ) ;
/* functions supporting jsonb_delete, jsonb_set and jsonb_concat */
static JsonbValue * IteratorConcat ( JsonbIterator * * it1 , JsonbIterator * * it2 ,
JsonbParseState * * state ) ;
static JsonbValue * setPath ( JsonbIterator * * it , Datum * path_elems ,
bool * path_nulls , int path_len ,
JsonbParseState * * st , int level , Jsonb * newval ,
int op_type ) ;
static void setPathObject ( JsonbIterator * * it , Datum * path_elems ,
bool * path_nulls , int path_len , JsonbParseState * * st ,
int level ,
Jsonb * newval , uint32 npairs , int op_type ) ;
static void setPathArray ( JsonbIterator * * it , Datum * path_elems ,
bool * path_nulls , int path_len , JsonbParseState * * st ,
int level , Jsonb * newval , uint32 nelems , int op_type ) ;
static void addJsonbToParseState ( JsonbParseState * * jbps , Jsonb * jb ) ;
/* state for json_object_keys */
typedef struct OkeysState
{
@ -267,10 +160,118 @@ typedef struct StripnullState
bool skip_next_null ;
} StripnullState ;
/* semantic action functions for json_object_keys */
static void okeys_object_field_start ( void * state , char * fname , bool isnull ) ;
static void okeys_array_start ( void * state ) ;
static void okeys_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
/* semantic action functions for json_get* functions */
static void get_object_start ( void * state ) ;
static void get_object_end ( void * state ) ;
static void get_object_field_start ( void * state , char * fname , bool isnull ) ;
static void get_object_field_end ( void * state , char * fname , bool isnull ) ;
static void get_array_start ( void * state ) ;
static void get_array_end ( void * state ) ;
static void get_array_element_start ( void * state , bool isnull ) ;
static void get_array_element_end ( void * state , bool isnull ) ;
static void get_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
/* common worker function for json getter functions */
static Datum get_path_all ( FunctionCallInfo fcinfo , bool as_text ) ;
static text * get_worker ( text * json , char * * tpath , int * ipath , int npath ,
bool normalize_results ) ;
static Datum get_jsonb_path_all ( FunctionCallInfo fcinfo , bool as_text ) ;
/* semantic action functions for json_array_length */
static void alen_object_start ( void * state ) ;
static void alen_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
static void alen_array_element_start ( void * state , bool isnull ) ;
/* common workers for json{b}_each* functions */
static Datum each_worker ( FunctionCallInfo fcinfo , bool as_text ) ;
static Datum each_worker_jsonb ( FunctionCallInfo fcinfo , const char * funcname ,
bool as_text ) ;
/* semantic action functions for json_each */
static void each_object_field_start ( void * state , char * fname , bool isnull ) ;
static void each_object_field_end ( void * state , char * fname , bool isnull ) ;
static void each_array_start ( void * state ) ;
static void each_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
/* common workers for json{b}_array_elements_* functions */
static Datum elements_worker ( FunctionCallInfo fcinfo , const char * funcname ,
bool as_text ) ;
static Datum elements_worker_jsonb ( FunctionCallInfo fcinfo , const char * funcname ,
bool as_text ) ;
/* semantic action functions for json_array_elements */
static void elements_object_start ( void * state ) ;
static void elements_array_element_start ( void * state , bool isnull ) ;
static void elements_array_element_end ( void * state , bool isnull ) ;
static void elements_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
/* turn a json object into a hash table */
static HTAB * get_json_object_as_hash ( text * json , const char * funcname ) ;
/* common worker for populate_record and to_record */
static Datum populate_record_worker ( FunctionCallInfo fcinfo , const char * funcname ,
bool have_record_arg ) ;
/* semantic action functions for get_json_object_as_hash */
static void hash_object_field_start ( void * state , char * fname , bool isnull ) ;
static void hash_object_field_end ( void * state , char * fname , bool isnull ) ;
static void hash_array_start ( void * state ) ;
static void hash_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
/* semantic action functions for populate_recordset */
static void populate_recordset_object_field_start ( void * state , char * fname , bool isnull ) ;
static void populate_recordset_object_field_end ( void * state , char * fname , bool isnull ) ;
static void populate_recordset_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
static void populate_recordset_object_start ( void * state ) ;
static void populate_recordset_object_end ( void * state ) ;
static void populate_recordset_array_start ( void * state ) ;
static void populate_recordset_array_element_start ( void * state , bool isnull ) ;
/* semantic action functions for json_strip_nulls */
static void sn_object_start ( void * state ) ;
static void sn_object_end ( void * state ) ;
static void sn_array_start ( void * state ) ;
static void sn_array_end ( void * state ) ;
static void sn_object_field_start ( void * state , char * fname , bool isnull ) ;
static void sn_array_element_start ( void * state , bool isnull ) ;
static void sn_scalar ( void * state , char * token , JsonTokenType tokentype ) ;
/* Turn a jsonb object into a record */
static void make_row_from_rec_and_jsonb ( Jsonb * element ,
PopulateRecordsetState * state ) ;
/* worker function for populate_recordset and to_recordset */
static Datum populate_recordset_worker ( FunctionCallInfo fcinfo , const char * funcname ,
bool have_record_arg ) ;
/* Worker that takes care of common setup for us */
static JsonbValue * findJsonbValueFromContainerLen ( JsonbContainer * container ,
uint32 flags ,
char * key ,
uint32 keylen ) ;
/* functions supporting jsonb_delete, jsonb_set and jsonb_concat */
static JsonbValue * IteratorConcat ( JsonbIterator * * it1 , JsonbIterator * * it2 ,
JsonbParseState * * state ) ;
static JsonbValue * setPath ( JsonbIterator * * it , Datum * path_elems ,
bool * path_nulls , int path_len ,
JsonbParseState * * st , int level , Jsonb * newval ,
int op_type ) ;
static void setPathObject ( JsonbIterator * * it , Datum * path_elems ,
bool * path_nulls , int path_len , JsonbParseState * * st ,
int level ,
Jsonb * newval , uint32 npairs , int op_type ) ;
static void setPathArray ( JsonbIterator * * it , Datum * path_elems ,
bool * path_nulls , int path_len , JsonbParseState * * st ,
int level , Jsonb * newval , uint32 nelems , int op_type ) ;
static void addJsonbToParseState ( JsonbParseState * * jbps , Jsonb * jb ) ;
/*
* SQL function json_object_keys
*