text *key = PG_GETARG_TEXT_PP(1);
JsonbValue *v = NULL;
+ JsonbValue kval;
+
+ kval.type = jbvString;
+ kval.string.val = VARDATA_ANY(key);
+ kval.string.len = VARSIZE_ANY_EXHDR(key);
+
if (!JB_ISEMPTY(jb))
- v = findJsonbValueFromSuperHeaderLen(VARDATA(jb),
- JB_FOBJECT | JB_FARRAY,
- NULL,
- VARDATA_ANY(key),
- VARSIZE_ANY_EXHDR(key));
+ v = findJsonbValueFromSuperHeader(VARDATA(jb),
+ JB_FOBJECT | JB_FARRAY,
+ NULL,
+ &kval);
PG_RETURN_BOOL(v != NULL);
}
return res;
}
-/*
- * findJsonbValueFromSuperHeader() wrapper that sets up JsonbValue key.
- */
-JsonbValue *
-findJsonbValueFromSuperHeaderLen(JsonbSuperHeader sheader, uint32 flags,
- uint32 *lowbound, char *key, uint32 keylen)
-{
- JsonbValue v;
-
- if (key == NULL)
- {
- v.type = jbvNull;
- }
- else
- {
- v.type = jbvString;
- v.string.val = key;
- v.string.len = keylen;
- }
-
- return findJsonbValueFromSuperHeader(sheader, flags, lowbound, &v);
-}
-
/*
* Find value in object (i.e. the value part of some key/value pair in an
* object), or find a matching element in an array. Do so on the basis on
/* worker function for populate_recordset and to_recordset */
static inline Datum populate_recordset_worker(FunctionCallInfo fcinfo,
bool have_record_arg);
+/* Worker that takes care of common setup for us */
+static JsonbValue *findJsonbValueFromSuperHeaderLen(JsonbSuperHeader sheader,
+ uint32 flags,
+ uint32 *lowbound,
+ char *key,
+ uint32 keylen);
/* search type classification for json_get* functions */
typedef enum
hashentry->val = _state->saved_scalar;
}
}
+
+/*
+ * findJsonbValueFromSuperHeader() wrapper that sets up JsonbValue key
+ * according to our frequent requirements.
+ */
+static JsonbValue *
+findJsonbValueFromSuperHeaderLen(JsonbSuperHeader sheader, uint32 flags,
+ uint32 *lowbound, char *key, uint32 keylen)
+{
+ JsonbValue k;
+
+ if (key == NULL)
+ {
+ k.type = jbvNull;
+ }
+ else
+ {
+ k.type = jbvString;
+ k.string.val = key;
+ k.string.len = keylen;
+ }
+
+ return findJsonbValueFromSuperHeader(sheader, flags, lowbound, &k);
+}
/* Support functions */
extern int compareJsonbSuperHeaderValue(JsonbSuperHeader a,
JsonbSuperHeader b);
-extern JsonbValue *findJsonbValueFromSuperHeaderLen(JsonbSuperHeader sheader,
- uint32 flags,
- uint32 *lowbound,
- char *key, uint32 keylen);
extern JsonbValue *findJsonbValueFromSuperHeader(JsonbSuperHeader sheader,
uint32 flags,
uint32 *lowbound,