I guess it'd be useful to mention what types the different fields are, doh!

Begin forwarded message:

> Hey all,
> 
> I'm working on some server-side C code that involves a few calculations on a 
> numeric value. The calculation is along the lines of:
>       (numeric) result = (numeric) value * ((int) base ^ (int) power);
> 
> What's the usual approach to write functions like these?
> 
> This is how far I got:
> 
> #include <postgres.h>
> #include <fmgr.h>
> #include <executor/spi.h>
> #include <executor/executor.h>
> #include <utils/numeric.h>
> #include <utils/builtins.h>
> 
> PG_FUNCTION_INFO_V1(unit_product__aggregate_state);
> 
> Datum
> unit_product__aggregate_state(PG_FUNCTION_ARGS)
> {
>    Datum state                = PG_GETARG_DATUM(0);

This is a numeric.

>    HeapTupleHeader t  = PG_GETARG_HEAPTUPLEHEADER(1);
> 
>    Datum base, scale, exponent;

These are all ints.

>    Datum result;

This is a numeric again.

>    bool isNull;
> 
>    base       = GetAttributeByName(t, "base", &isNull);
>    if (isNull)
>       PG_RETURN_NULL();
> 
>    scale      = GetAttributeByName(t, "scale", &isNull);
>    if (isNull)
>       PG_RETURN_NULL();
> 
>    exponent   = GetAttributeByName(t, "exponent", &isNull);
>    if (isNull)
>       PG_RETURN_NULL();
> 
> 
>    /* state *= base ^ (scale * exponent) */
>    result = DirectFunctionCall2(int4mul, scale, exponent);
>    result = DirectFunctionCall2(numeric_power, base, result);
>    result = DirectFunctionCall2(numeric_mul, state, result);
> 
>    PG_RETURN_NUMERIC(result);
> }
> 
> But it crashes the server, probably because I'm passing ints where numerics 
> are expected. Is this the right approach at all? And if so, how am I supposed 
> to cast those ints to numerics?
> 
> Are there any examples around for dealing with numerics? The stuff in the 
> documentation (http://www.postgresql.org/docs/8.4/interactive/xfunc-c.html) 
> conveniently omits numerics, so I had to dig through doxygen to get as far as 
> I am now...

Alban Hertroys

--
Screwing up is the best way to attach something to the ceiling.


!DSPAM:737,4b74034810441727621217!



-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to