in src/backend/utils/adt/agtype_ops.c [650:710]
Datum agtype_mul(PG_FUNCTION_ARGS)
{
agtype *lhs = AG_GET_ARG_AGTYPE_P(0);
agtype *rhs = AG_GET_ARG_AGTYPE_P(1);
agtype_value *agtv_lhs;
agtype_value *agtv_rhs;
agtype_value agtv_result;
if (!(AGT_ROOT_IS_SCALAR(lhs)) || !(AGT_ROOT_IS_SCALAR(rhs)))
{
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("must be scalar value, not array or object")));
PG_RETURN_NULL();
}
agtv_lhs = get_ith_agtype_value_from_container(&lhs->root, 0);
agtv_rhs = get_ith_agtype_value_from_container(&rhs->root, 0);
if (agtv_lhs->type == AGTV_INTEGER && agtv_rhs->type == AGTV_INTEGER)
{
agtv_result.type = AGTV_INTEGER;
agtv_result.val.int_value = agtv_lhs->val.int_value *
agtv_rhs->val.int_value;
}
else if (agtv_lhs->type == AGTV_FLOAT && agtv_rhs->type == AGTV_FLOAT)
{
agtv_result.type = AGTV_FLOAT;
agtv_result.val.float_value = agtv_lhs->val.float_value *
agtv_rhs->val.float_value;
}
else if (agtv_lhs->type == AGTV_FLOAT && agtv_rhs->type == AGTV_INTEGER)
{
agtv_result.type = AGTV_FLOAT;
agtv_result.val.float_value = agtv_lhs->val.float_value *
agtv_rhs->val.int_value;
}
else if (agtv_lhs->type == AGTV_INTEGER && agtv_rhs->type == AGTV_FLOAT)
{
agtv_result.type = AGTV_FLOAT;
agtv_result.val.float_value = agtv_lhs->val.int_value *
agtv_rhs->val.float_value;
}
/* Is this a numeric result */
else if (is_numeric_result(agtv_lhs, agtv_rhs))
{
Datum numd, lhsd, rhsd;
lhsd = get_numeric_datum_from_agtype_value(agtv_lhs);
rhsd = get_numeric_datum_from_agtype_value(agtv_rhs);
numd = DirectFunctionCall2(numeric_mul, lhsd, rhsd);
agtv_result.type = AGTV_NUMERIC;
agtv_result.val.numeric = DatumGetNumeric(numd);
}
else
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("Invalid input parameter types for agtype_mul")));
AG_RETURN_AGTYPE_P(agtype_value_to_agtype(&agtv_result));
}