in src/backend/utils/adt/age_vle.c [2214:2341]
Datum age_match_vle_terminal_edge(PG_FUNCTION_ARGS)
{
int nargs = 0;
Datum *args = NULL;
bool *nulls = NULL;
Oid *types = NULL;
VLE_path_container *vpc = NULL;
agtype *agt_arg_vsid = NULL;
agtype *agt_arg_veid = NULL;
agtype *agt_arg_path = NULL;
agtype_value *agtv_temp = NULL;
graphid vsid = 0;
graphid veid = 0;
graphid *gida = NULL;
int gidasize = 0;
/* extract argument values */
nargs = extract_variadic_args(fcinfo, 0, true, &args, &types, &nulls);
if (nargs != 3)
{
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("age_match_terminal_edge() invalid number of arguments")));
}
/* the arguments cannot be NULL */
if (nulls[0] || nulls[1] || nulls[2])
{
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("match_vle_terminal_edge() arguments cannot be NULL")));
}
/* get the vpc */
agt_arg_path = DATUM_GET_AGTYPE_P(args[2]);
/* it cannot be NULL */
if (is_agtype_null(agt_arg_path))
{
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("match_vle_terminal_edge() argument 3 cannot be NULL")));
}
/*
* The vpc (path) must be a binary container and the type of the object in
* the container must be an AGT_FBINARY_TYPE_VLE_PATH.
*/
Assert(AGT_ROOT_IS_BINARY(agt_arg_path));
Assert(AGT_ROOT_BINARY_FLAGS(agt_arg_path) == AGT_FBINARY_TYPE_VLE_PATH);
/* get the container */
vpc = (VLE_path_container *)agt_arg_path;
/* get the graphid array from the container */
gida = GET_GRAPHID_ARRAY_FROM_CONTAINER(vpc);
/* get the gida array size */
gidasize = vpc->graphid_array_size;
/* verify the minimum size is 3 or 1 */
Assert(gidasize >= 3 || gidasize == 1);
/* get the vsid */
if (types[0] == AGTYPEOID)
{
agt_arg_vsid = DATUM_GET_AGTYPE_P(args[0]);
if (!is_agtype_null(agt_arg_vsid))
{
agtv_temp =
get_ith_agtype_value_from_container(&agt_arg_vsid->root, 0);
Assert(agtv_temp->type == AGTV_INTEGER);
vsid = agtv_temp->val.int_value;
}
else
{
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("match_vle_terminal_edge() argument 1 must be non NULL")));
}
}
else if (types[0] == GRAPHIDOID)
{
vsid = DATUM_GET_GRAPHID(args[0]);
}
else
{
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("match_vle_terminal_edge() argument 1 must be an agtype integer or a graphid")));
}
/* get the veid */
if (types[1] == AGTYPEOID)
{
agt_arg_veid = DATUM_GET_AGTYPE_P(args[1]);
if (!is_agtype_null(agt_arg_veid))
{
agtv_temp = get_ith_agtype_value_from_container(&agt_arg_veid->root,
0);
Assert(agtv_temp->type == AGTV_INTEGER);
veid = agtv_temp->val.int_value;
}
else
{
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("match_vle_terminal_edge() argument 2 must be non NULL")));
}
}
else if (types[1] == GRAPHIDOID)
{
veid = DATUM_GET_GRAPHID(args[1]);
}
else
{
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("match_vle_terminal_edge() argument 2 must be an agtype integer or a graphid")));
}
/* compare the path beginning or end points */
PG_RETURN_BOOL(gida[0] == vsid && veid == gida[gidasize - 1]);
}