@ -1909,9 +1909,6 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text)
{
Jsonb * jb = PG_GETARG_JSONB_P ( 0 ) ;
ReturnSetInfo * rsi ;
Tuplestorestate * tuple_store ;
TupleDesc tupdesc ;
TupleDesc ret_tdesc ;
MemoryContext old_cxt ,
tmp_cxt ;
bool skipNested = false ;
@ -1926,30 +1923,7 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text)
funcname ) ) ) ;
rsi = ( ReturnSetInfo * ) fcinfo - > resultinfo ;
if ( ! rsi | | ! IsA ( rsi , ReturnSetInfo ) )
ereport ( ERROR ,
( errcode ( ERRCODE_FEATURE_NOT_SUPPORTED ) ,
errmsg ( " set-valued function called in context that cannot accept a set " ) ) ) ;
if ( ! ( rsi - > allowedModes & SFRM_Materialize ) )
ereport ( ERROR ,
( errcode ( ERRCODE_FEATURE_NOT_SUPPORTED ) ,
errmsg ( " materialize mode required, but it is not allowed in this context " ) ) ) ;
rsi - > returnMode = SFRM_Materialize ;
if ( get_call_result_type ( fcinfo , NULL , & tupdesc ) ! = TYPEFUNC_COMPOSITE )
elog ( ERROR , " return type must be a row type " ) ;
old_cxt = MemoryContextSwitchTo ( rsi - > econtext - > ecxt_per_query_memory ) ;
ret_tdesc = CreateTupleDescCopy ( tupdesc ) ;
BlessTupleDesc ( ret_tdesc ) ;
tuple_store =
tuplestore_begin_heap ( rsi - > allowedModes & SFRM_Materialize_Random ,
false , work_mem ) ;
MemoryContextSwitchTo ( old_cxt ) ;
SetSingleFuncCall ( fcinfo , SRF_SINGLE_BLESS ) ;
tmp_cxt = AllocSetContextCreate ( CurrentMemoryContext ,
" jsonb_each temporary cxt " ,
@ -1964,7 +1938,6 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text)
if ( r = = WJB_KEY )
{
text * key ;
HeapTuple tuple ;
Datum values [ 2 ] ;
bool nulls [ 2 ] = { false , false } ;
@ -2001,9 +1974,7 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text)
values [ 1 ] = PointerGetDatum ( val ) ;
}
tuple = heap_form_tuple ( ret_tdesc , values , nulls ) ;
tuplestore_puttuple ( tuple_store , tuple ) ;
tuplestore_putvalues ( rsi - > setResult , rsi - > setDesc , values , nulls ) ;
/* clean up and switch back */
MemoryContextSwitchTo ( old_cxt ) ;
@ -2013,9 +1984,6 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text)
MemoryContextDelete ( tmp_cxt ) ;
rsi - > setResult = tuple_store ;
rsi - > setDesc = ret_tdesc ;
PG_RETURN_NULL ( ) ;
}
@ -2027,8 +1995,6 @@ each_worker(FunctionCallInfo fcinfo, bool as_text)
JsonLexContext * lex ;
JsonSemAction * sem ;
ReturnSetInfo * rsi ;
MemoryContext old_cxt ;
TupleDesc tupdesc ;
EachState * state ;
lex = makeJsonLexContext ( json , true ) ;
@ -2037,30 +2003,9 @@ each_worker(FunctionCallInfo fcinfo, bool as_text)
rsi = ( ReturnSetInfo * ) fcinfo - > resultinfo ;
if ( ! rsi | | ! IsA ( rsi , ReturnSetInfo ) )
ereport ( ERROR ,
( errcode ( ERRCODE_FEATURE_NOT_SUPPORTED ) ,
errmsg ( " set-valued function called in context that cannot accept a set " ) ) ) ;
if ( ! ( rsi - > allowedModes & SFRM_Materialize ) )
ereport ( ERROR ,
( errcode ( ERRCODE_FEATURE_NOT_SUPPORTED ) ,
errmsg ( " materialize mode required, but it is not allowed in this context " ) ) ) ;
rsi - > returnMode = SFRM_Materialize ;
( void ) get_call_result_type ( fcinfo , NULL , & tupdesc ) ;
/* make these in a sufficiently long-lived memory context */
old_cxt = MemoryContextSwitchTo ( rsi - > econtext - > ecxt_per_query_memory ) ;
state - > ret_tdesc = CreateTupleDescCopy ( tupdesc ) ;
BlessTupleDesc ( state - > ret_tdesc ) ;
state - > tuple_store =
tuplestore_begin_heap ( rsi - > allowedModes & SFRM_Materialize_Random ,
false , work_mem ) ;
MemoryContextSwitchTo ( old_cxt ) ;
SetSingleFuncCall ( fcinfo , SRF_SINGLE_BLESS ) ;
state - > tuple_store = rsi - > setResult ;
state - > ret_tdesc = rsi - > setDesc ;
sem - > semstate = ( void * ) state ;
sem - > array_start = each_array_start ;
@ -2079,9 +2024,6 @@ each_worker(FunctionCallInfo fcinfo, bool as_text)
MemoryContextDelete ( state - > tmp_cxt ) ;
rsi - > setResult = state - > tuple_store ;
rsi - > setDesc = state - > ret_tdesc ;
PG_RETURN_NULL ( ) ;
}
@ -2206,9 +2148,6 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname,
{
Jsonb * jb = PG_GETARG_JSONB_P ( 0 ) ;
ReturnSetInfo * rsi ;
Tuplestorestate * tuple_store ;
TupleDesc tupdesc ;
TupleDesc ret_tdesc ;
MemoryContext old_cxt ,
tmp_cxt ;
bool skipNested = false ;
@ -2227,31 +2166,8 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname,
rsi = ( ReturnSetInfo * ) fcinfo - > resultinfo ;
if ( ! rsi | | ! IsA ( rsi , ReturnSetInfo ) )
ereport ( ERROR ,
( errcode ( ERRCODE_FEATURE_NOT_SUPPORTED ) ,
errmsg ( " set-valued function called in context that cannot accept a set " ) ) ) ;
if ( ! ( rsi - > allowedModes & SFRM_Materialize ) | |
rsi - > expectedDesc = = NULL )
ereport ( ERROR ,
( errcode ( ERRCODE_FEATURE_NOT_SUPPORTED ) ,
errmsg ( " materialize mode required, but it is not allowed in this context " ) ) ) ;
rsi - > returnMode = SFRM_Materialize ;
/* it's a simple type, so don't use get_call_result_type() */
tupdesc = rsi - > expectedDesc ;
old_cxt = MemoryContextSwitchTo ( rsi - > econtext - > ecxt_per_query_memory ) ;
ret_tdesc = CreateTupleDescCopy ( tupdesc ) ;
BlessTupleDesc ( ret_tdesc ) ;
tuple_store =
tuplestore_begin_heap ( rsi - > allowedModes & SFRM_Materialize_Random ,
false , work_mem ) ;
MemoryContextSwitchTo ( old_cxt ) ;
SetSingleFuncCall ( fcinfo ,
SRF_SINGLE_USE_EXPECTED | SRF_SINGLE_BLESS ) ;
tmp_cxt = AllocSetContextCreate ( CurrentMemoryContext ,
" jsonb_array_elements temporary cxt " ,
@ -2265,7 +2181,6 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname,
if ( r = = WJB_ELEM )
{
HeapTuple tuple ;
Datum values [ 1 ] ;
bool nulls [ 1 ] = { false } ;
@ -2291,9 +2206,7 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname,
values [ 0 ] = PointerGetDatum ( val ) ;
}
tuple = heap_form_tuple ( ret_tdesc , values , nulls ) ;
tuplestore_puttuple ( tuple_store , tuple ) ;
tuplestore_putvalues ( rsi - > setResult , rsi - > setDesc , values , nulls ) ;
/* clean up and switch back */
MemoryContextSwitchTo ( old_cxt ) ;
@ -2303,9 +2216,6 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname,
MemoryContextDelete ( tmp_cxt ) ;
rsi - > setResult = tuple_store ;
rsi - > setDesc = ret_tdesc ;
PG_RETURN_NULL ( ) ;
}
@ -2330,41 +2240,15 @@ elements_worker(FunctionCallInfo fcinfo, const char *funcname, bool as_text)
JsonLexContext * lex = makeJsonLexContext ( json , as_text ) ;
JsonSemAction * sem ;
ReturnSetInfo * rsi ;
MemoryContext old_cxt ;
TupleDesc tupdesc ;
ElementsState * state ;
state = palloc0 ( sizeof ( ElementsState ) ) ;
sem = palloc0 ( sizeof ( JsonSemAction ) ) ;
SetSingleFuncCall ( fcinfo , SRF_SINGLE_USE_EXPECTED | SRF_SINGLE_BLESS ) ;
rsi = ( ReturnSetInfo * ) fcinfo - > resultinfo ;
if ( ! rsi | | ! IsA ( rsi , ReturnSetInfo ) )
ereport ( ERROR ,
( errcode ( ERRCODE_FEATURE_NOT_SUPPORTED ) ,
errmsg ( " set-valued function called in context that cannot accept a set " ) ) ) ;
if ( ! ( rsi - > allowedModes & SFRM_Materialize ) | |
rsi - > expectedDesc = = NULL )
ereport ( ERROR ,
( errcode ( ERRCODE_FEATURE_NOT_SUPPORTED ) ,
errmsg ( " materialize mode required, but it is not allowed in this context " ) ) ) ;
rsi - > returnMode = SFRM_Materialize ;
/* it's a simple type, so don't use get_call_result_type() */
tupdesc = rsi - > expectedDesc ;
/* make these in a sufficiently long-lived memory context */
old_cxt = MemoryContextSwitchTo ( rsi - > econtext - > ecxt_per_query_memory ) ;
state - > ret_tdesc = CreateTupleDescCopy ( tupdesc ) ;
BlessTupleDesc ( state - > ret_tdesc ) ;
state - > tuple_store =
tuplestore_begin_heap ( rsi - > allowedModes & SFRM_Materialize_Random ,
false , work_mem ) ;
MemoryContextSwitchTo ( old_cxt ) ;
state - > tuple_store = rsi - > setResult ;
state - > ret_tdesc = rsi - > setDesc ;
sem - > semstate = ( void * ) state ;
sem - > object_start = elements_object_start ;
@ -2384,9 +2268,6 @@ elements_worker(FunctionCallInfo fcinfo, const char *funcname, bool as_text)
MemoryContextDelete ( state - > tmp_cxt ) ;
rsi - > setResult = state - > tuple_store ;
rsi - > setDesc = state - > ret_tdesc ;
PG_RETURN_NULL ( ) ;
}