in src/backend/utils/adt/agtype_ops.c [1373:1428]
Datum agtype_exists_all_agtype(PG_FUNCTION_ARGS)
{
agtype *agt = AG_GET_ARG_AGTYPE_P(0);
agtype *keys = AG_GET_ARG_AGTYPE_P(1);
agtype_value elem;
agtype_iterator *it = NULL;
if (AGT_ROOT_IS_SCALAR(agt))
{
agt = agtype_value_to_agtype(extract_entity_properties(agt, true));
}
if (!AGT_ROOT_IS_SCALAR(keys) && !AGT_ROOT_IS_OBJECT(keys))
{
while ((it = get_next_list_element(it, &keys->root, &elem)))
{
if (IS_A_AGTYPE_SCALAR(&elem))
{
if ((&elem)->type == AGTV_NULL)
{
continue;
}
else if (AGT_ROOT_IS_OBJECT(agt) &&
(&elem)->type == AGTV_STRING &&
find_agtype_value_from_container(&agt->root,
AGT_FOBJECT,
&elem))
{
continue;
}
else if (AGT_ROOT_IS_ARRAY(agt) &&
find_agtype_value_from_container(&agt->root,
AGT_FARRAY,
&elem))
{
continue;
}
else
{
PG_RETURN_BOOL(false);
}
}
else
{
PG_RETURN_BOOL(false);
}
}
}
else
{
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid agtype value for right operand")));
}
PG_RETURN_BOOL(true);
}