Tidy up the populate/to_record{set} code for json a bit.

In the process fix a small bug.
This commit is contained in:
Andrew Dunstan 2014-03-25 21:20:54 -04:00
parent 49638868f8
commit fbc3def862
1 changed files with 18 additions and 36 deletions

View File

@ -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))
{
if (PG_ARGISNULL(1))
PG_RETURN_NULL(); PG_RETURN_NULL();
if (PG_ARGISNULL(0)) if (!have_record_arg || PG_ARGISNULL(0))
rec = NULL; rec = NULL;
else else
rec = PG_GETARG_HEAPTUPLEHEADER(0); rec = PG_GETARG_HEAPTUPLEHEADER(0);
}
else
{
if (PG_ARGISNULL(1))
PG_RETURN_NULL();
rec = NULL;
}
tupType = tupdesc->tdtypeid; tupType = tupdesc->tdtypeid;
tupTypmod = tupdesc->tdtypmod; tupTypmod = tupdesc->tdtypmod;