On 25.01.2017 23:58, Tom Lane wrote:
> I think you need to take a second look at the code you're producing
> and realize that it's not so clean either. This extract from
> populate_record_field, for example, is pretty horrid:
But what if we introduce some helper macros like this:
#define JsValueIsNull(jsv) \ ((jsv)->is_json ? !(jsv)->val.json.str \ : !(jsv)->val.jsonb ||
(jsv)->val.jsonb->type== jbvNull)
#define JsValueIsString(jsv) \ ((jsv)->is_json ? (jsv)->val.json.type == JSON_TOKEN_STRING \ :
(jsv)->val.jsonb&& (jsv)->val.jsonb->type == jbvString)
/* prepare column metadata cache for the given type */ if (col->typid != typid || col->typmod != typmod)
prepare_column_cache(col, typid, typmod, mcxt, jsv->is_json);
*isnull = JsValueIsNull(jsv);
typcat = col->typcat;
/* try to convert json string to a non-scalar type through input function */ if (JsValueIsString(jsv) &&
(typcat == TYPECAT_ARRAY || typcat == TYPECAT_COMPOSITE)) typcat = TYPECAT_SCALAR;
/* we must perform domain checks for NULLs */ if (*isnull && typcat != TYPECAT_DOMAIN) return (Datum)
0;
--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company