mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-04 23:36:54 +02:00
Tidy up the populate/to_record{set} code for json a bit.
In the process fix a small bug.
This commit is contained in:
parent
49638868f8
commit
fbc3def862
@ -2029,8 +2029,8 @@ json_to_record(PG_FUNCTION_ARGS)
|
|||||||
static inline Datum
|
static inline Datum
|
||||||
populate_record_worker(FunctionCallInfo fcinfo, bool have_record_arg)
|
populate_record_worker(FunctionCallInfo fcinfo, bool have_record_arg)
|
||||||
{
|
{
|
||||||
Oid argtype;
|
int json_arg_num = have_record_arg ? 1 : 0;
|
||||||
Oid jtype = get_fn_expr_argtype(fcinfo->flinfo, have_record_arg ? 1 : 0);
|
Oid jtype = get_fn_expr_argtype(fcinfo->flinfo, json_arg_num);
|
||||||
text *json;
|
text *json;
|
||||||
Jsonb *jb = NULL;
|
Jsonb *jb = NULL;
|
||||||
bool use_json_as_text;
|
bool use_json_as_text;
|
||||||
@ -2049,12 +2049,12 @@ populate_record_worker(FunctionCallInfo fcinfo, bool have_record_arg)
|
|||||||
|
|
||||||
Assert(jtype == JSONOID || jtype == JSONBOID);
|
Assert(jtype == JSONOID || jtype == JSONBOID);
|
||||||
|
|
||||||
use_json_as_text = PG_ARGISNULL(have_record_arg ? 2 : 1) ? false :
|
use_json_as_text = PG_ARGISNULL(json_arg_num + 1) ? false :
|
||||||
PG_GETARG_BOOL(have_record_arg ? 2 : 1);
|
PG_GETARG_BOOL(json_arg_num + 1);
|
||||||
|
|
||||||
if (have_record_arg)
|
if (have_record_arg)
|
||||||
{
|
{
|
||||||
argtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
|
Oid argtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
|
||||||
|
|
||||||
if (!type_is_rowtype(argtype))
|
if (!type_is_rowtype(argtype))
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
@ -2091,8 +2091,6 @@ populate_record_worker(FunctionCallInfo fcinfo, bool have_record_arg)
|
|||||||
else
|
else
|
||||||
{ /* json{b}_to_record case */
|
{ /* json{b}_to_record case */
|
||||||
|
|
||||||
use_json_as_text = PG_ARGISNULL(1) ? false : PG_GETARG_BOOL(1);
|
|
||||||
|
|
||||||
if (PG_ARGISNULL(0))
|
if (PG_ARGISNULL(0))
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
|
|
||||||
@ -2108,7 +2106,7 @@ populate_record_worker(FunctionCallInfo fcinfo, bool have_record_arg)
|
|||||||
if (jtype == JSONOID)
|
if (jtype == JSONOID)
|
||||||
{
|
{
|
||||||
/* just get the text */
|
/* just get the text */
|
||||||
json = PG_GETARG_TEXT_P(have_record_arg ? 1 : 0);
|
json = PG_GETARG_TEXT_P(json_arg_num);
|
||||||
|
|
||||||
json_hash = get_json_object_as_hash(json, "json_populate_record", use_json_as_text);
|
json_hash = get_json_object_as_hash(json, "json_populate_record", use_json_as_text);
|
||||||
|
|
||||||
@ -2123,7 +2121,7 @@ populate_record_worker(FunctionCallInfo fcinfo, bool have_record_arg)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
jb = PG_GETARG_JSONB(have_record_arg ? 1 : 0);
|
jb = PG_GETARG_JSONB(json_arg_num);
|
||||||
|
|
||||||
/* same logic as for json */
|
/* same logic as for json */
|
||||||
if (!have_record_arg && rec)
|
if (!have_record_arg && rec)
|
||||||
@ -2591,8 +2589,8 @@ json_to_recordset(PG_FUNCTION_ARGS)
|
|||||||
static inline Datum
|
static inline Datum
|
||||||
populate_recordset_worker(FunctionCallInfo fcinfo, bool have_record_arg)
|
populate_recordset_worker(FunctionCallInfo fcinfo, bool have_record_arg)
|
||||||
{
|
{
|
||||||
Oid argtype;
|
int json_arg_num = have_record_arg ? 1 : 0;
|
||||||
Oid jtype = get_fn_expr_argtype(fcinfo->flinfo, have_record_arg ? 1 : 0);
|
Oid jtype = get_fn_expr_argtype(fcinfo->flinfo, json_arg_num);
|
||||||
bool use_json_as_text;
|
bool use_json_as_text;
|
||||||
ReturnSetInfo *rsi;
|
ReturnSetInfo *rsi;
|
||||||
MemoryContext old_cxt;
|
MemoryContext old_cxt;
|
||||||
@ -2604,22 +2602,16 @@ populate_recordset_worker(FunctionCallInfo fcinfo, bool have_record_arg)
|
|||||||
int ncolumns;
|
int ncolumns;
|
||||||
PopulateRecordsetState *state;
|
PopulateRecordsetState *state;
|
||||||
|
|
||||||
|
use_json_as_text = PG_ARGISNULL(json_arg_num + 1) ? false : PG_GETARG_BOOL(json_arg_num + 1);
|
||||||
|
|
||||||
if (have_record_arg)
|
if (have_record_arg)
|
||||||
{
|
{
|
||||||
argtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
|
Oid argtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
|
||||||
|
|
||||||
use_json_as_text = PG_ARGISNULL(2) ? false : PG_GETARG_BOOL(2);
|
|
||||||
|
|
||||||
if (!type_is_rowtype(argtype))
|
if (!type_is_rowtype(argtype))
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||||
errmsg("first argument of json_populate_recordset must be a row type")));
|
errmsg("first argument must be a row type")));
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
argtype = InvalidOid;
|
|
||||||
|
|
||||||
use_json_as_text = PG_ARGISNULL(1) ? false : PG_GETARG_BOOL(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rsi = (ReturnSetInfo *) fcinfo->resultinfo;
|
rsi = (ReturnSetInfo *) fcinfo->resultinfo;
|
||||||
@ -2647,23 +2639,13 @@ populate_recordset_worker(FunctionCallInfo fcinfo, bool have_record_arg)
|
|||||||
"that cannot accept type record")));
|
"that cannot accept type record")));
|
||||||
|
|
||||||
/* if the json is null send back an empty set */
|
/* if the json is null send back an empty set */
|
||||||
if (have_record_arg)
|
if (PG_ARGISNULL(json_arg_num))
|
||||||
{
|
PG_RETURN_NULL();
|
||||||
if (PG_ARGISNULL(1))
|
|
||||||
PG_RETURN_NULL();
|
|
||||||
|
|
||||||
if (PG_ARGISNULL(0))
|
|
||||||
rec = NULL;
|
|
||||||
else
|
|
||||||
rec = PG_GETARG_HEAPTUPLEHEADER(0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (PG_ARGISNULL(1))
|
|
||||||
PG_RETURN_NULL();
|
|
||||||
|
|
||||||
|
if (!have_record_arg || PG_ARGISNULL(0))
|
||||||
rec = NULL;
|
rec = NULL;
|
||||||
}
|
else
|
||||||
|
rec = PG_GETARG_HEAPTUPLEHEADER(0);
|
||||||
|
|
||||||
tupType = tupdesc->tdtypeid;
|
tupType = tupdesc->tdtypeid;
|
||||||
tupTypmod = tupdesc->tdtypmod;
|
tupTypmod = tupdesc->tdtypmod;
|
||||||
|
Loading…
Reference in New Issue
Block a user