Thread: C Function with Arrays Question

C Function with Arrays Question

From
Achilleus Mantzios
Date:
Hi,
Is there a way of accessing _float8 (float8[]) values inside of
a server-side C function??

For instance imagine:

# \d formulatest
           Table "formulatest"
 Column  |        Type        | Modifiers
---------+--------------------+-----------
 formula | double precision[] |

# insert into formulatest values('{2.3,3.3}');
# insert into formulatest values('{4.3,5.3}');

and then write a C function named formula

float8 *formula(x,formarray)
float8 *x;
_float8 *formarray; /* This is serious part of the question!! */
{
    float8 *result = (float8 *) malloc(sizeof(float8));
    /* what happened to palloc in pgsql 7.2??,
    * Also what happened to postgres.h??
    */

    *result = *formarray[0];
    return result;
/* This is pseudo code to demonstrate the question */
}

Thanx.

P.S.

7.2 runs quite stable on my Linux 2.4.7.
JDBC built without a problem, and also supports Arrays (at least one
dimension for sure).

--
Achilleus Mantzios
S/W Engineer
IT dept
Dynacom Tankers Mngmt
tel:    +30-10-8981112
fax:    +30-10-8981877
email:  it@dynacomtm.com
        rnd@gatewaynet.com


Re: C Function with Arrays Question

From
Tom Lane
Date:
Achilleus Mantzios <rnd@gatewaynet.com> writes:
> Is there a way of accessing _float8 (float8[]) values inside of
> a server-side C function??

There are some examples in the "FLOAT AGGREGATE OPERATORS" section of
src/backend/utils/adt/float.c.  construct_array() and
deconstruct_array() are the most general answers, but for fixed-width
element types like float8 you can cheat quite a lot.

>     /* what happened to palloc in pgsql 7.2??,

Nothing.

>     * Also what happened to postgres.h??

Also nothing.  Did you do "make install-all-headers"?

            regards, tom lane

Re: C Function with Arrays Question

From
Rnd@gatewaynet.com
Date:

Dear Tom,

regarding the question i posted, after tests and benchmarks,
i found that retreiving the _float8 array from JDBC and doing the
calculations
in java is faster than calling a C function that performs the same
calculation
on the same _float8 array and returns float8.
In the C function there were no DB calls or any other I/O calls but plain
arithmetic,
so i declared it iscached and the benchmark loop run 1000,10000 times and
so on.
I was surprised by the result!
I am running pgsql 7.2 on a linux 2.4.7, glibc 2.2.2