Thread:

From
eehab hamzeh
Date:
    Hello

I am trying to build some functions using C language. these functions are mentioned in the postgresql documentation.

http://www.postgresql.org/docs/8.3/interactive/xfunc-c.html

Datum
add_one_float8(PG_FUNCTION_ARGS)
{
/* The macros for FLOAT8 hide its pass-by-reference nature. */
float8 arg = PG_GETARG_FLOAT8(0);

PG_RETURN_FLOAT8(arg + 1.0);
}

PG_FUNCTION_INFO_V1(makepoint);

Datum
makepoint(PG_FUNCTION_ARGS)
{
/* Here, the pass-by-reference nature of Point is not hidden. */
Point *pointx = PG_GETARG_POINT_P(0);
Point *pointy = PG_GETARG_POINT_P(1);
Point *new_point = (Point *) palloc(sizeof(Point));

new_point->x = pointx->x;
new_point->y = pointy->y;

PG_RETURN_POINT_P(new_point);
}

the only function that are work are the one with int32 variable.
the other function bring errors and are not working
any body can give directions


kind regards
ihab


See all the ways you can stay connected to friends and family

Re:

From
eehab hamzeh
Date:

.ExternalClass .EC_hmmessage P {padding:0px;} .ExternalClass body.EC_hmmessage {font-size:10pt;font-family:Verdana;}here are the code and the error , i compile them using vc++ 6 and VC++ 2008 and minGW the example below are for minGW
THANKS

#include "postgres.h"
#include <string.h>
#include "fmgr.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

/* by value */

PG_FUNCTION_INFO_V1(add_one);
         
Datum
add_one(PG_FUNCTION_ARGS)
{
    int32   arg = PG_GETARG_INT32(0);

    PG_RETURN_INT32(arg + 1);
}

/* by reference, fixed length */

PG_FUNCTION_INFO_V1(add_one_float8);

Datum
add_one_float8(PG_FUNCTION_ARGS)
{
&nb sp;   /* The macros for FLOAT8 hide its pass-by-reference nature. */
    float8   arg = PG_GETARG_FLOAT8(0);

    PG_RETURN_FLOAT8(arg + 1.0);
}

PG_FUNCTION_INFO_V1(makepoint);

Datum
makepoint(PG_FUNCTION_ARGS)
{
    /* Here, the pass-by-reference nature of Point is not hidden. */
    Point     *pointx = PG_GETARG_POINT_P(0);
    Point     *pointy = PG_GETARG_POINT_P(1);
    Point     *new_point = (Point *) palloc(sizeof(Point));

    new_point->x = pointx->x;
    new_point->y = pointy->y;
       
    PG_RETURN_POINT_P(new_point);
}

/* by reference, variable length */

PG_FUNCTION_INFO_V1(copytext);

Datum
copytext(PG_FUNCTION_ARGS)
{
    text     *t = PG_GETARG_TEXT_P(0);
    /*
     * VARSIZE is the total size of the struct in bytes.
     */
    text     *new_t = (text *) palloc(VARSIZE(t));
    VARATT_SIZEP(new_t) = VARSIZE(t);
    /*
     * VARDATA is a pointer to the data region of the struct.
     */
    memcpy((void *) VARDATA(new_t), /* destination */
           (void *) VARDATA(t),     /* source */
           VARSIZE(t)-VARHDRSZ);    /* how many bytes */
    PG_RETURN_TEXT_P(new_t);
}

PG_FUNCTION_INFO_V1(concat_text);

Datum
concat_text(PG_FUNCTION_ARGS)
{
    text  *arg1 = PG_GETARG_TEXT_P(0);
    text  *arg2 = PG_GETARG_TEXT_P(1);
    int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
    text *new_text = (text *) palloc(new_text_size);

    VARATT_SIZEP(new_text) = new_text_size;
    memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1)-VARHDRSZ);
    memcpy(VARDATA(new_text) + (VARSIZE(arg1)-VARHDRSZ),
           VARDATA(arg2), VARSIZE(arg2)-VARHDRSZ);
  &n bsp; PG_RETURN_TEXT_P(new_text);
}


the error

in function 'makepoint':
error: 'Point' undeclared (first use in this function)
error: (each undeclared identifier is reported only one
error: for each function it appears in.)
error: 'pointx' undeclared (first use in ´this function)
error: 'pointy' undeclared (first use in his fnction)
error 'new_point' undeclared (first use in his function)
error: syntax error befre ')' oken
in function 'copy text':
error: 'invalid lvalue in assinment
In function 'concat_text'
error: invalid lvalue in assignement
warning no new line at end of file

Please any direction of how to solve the problem

thanks

< img alt="">




check out the rest of the Windows Live™. More than mail–Windows Live™ goes way beyond your inbox. More than messages

Re:

From
Robert Haas
Date:
You are posting to the wrong mailing list.

Please see:

http://www.postgresql.org/community/lists/

...Robert

2009/4/6 eehab hamzeh <eehab40@hotmail.com>:
>
> here are the code and the error , i compile them using vc++ 6 and VC++ 2008
> and minGW the example below are for minGW
> THANKS
>
> #include "postgres.h"
> #include <string.h>
> #include "fmgr.h"
>
> #ifdef PG_MODULE_MAGIC
> PG_MODULE_MAGIC;
> #endif
>
> /* by value */
>
> PG_FUNCTION_INFO_V1(add_one);
>
> Datum
> add_one(PG_FUNCTION_ARGS)
> {
>     int32   arg = PG_GETARG_INT32(0);
>
>     PG_RETURN_INT32(arg + 1);
> }
>
> /* by reference, fixed length */
>
> PG_FUNCTION_INFO_V1(add_one_float8);
>
> Datum
> add_one_float8(PG_FUNCTION_ARGS)
> {
> &nb sp;   /* The macros for FLOAT8 hide its pass-by-reference nature. */
>     float8   arg = PG_GETARG_FLOAT8(0);
>
>     PG_RETURN_FLOAT8(arg + 1.0);
> }
>
> PG_FUNCTION_INFO_V1(makepoint);
>
> Datum
> makepoint(PG_FUNCTION_ARGS)
> {
>     /* Here, the pass-by-reference nature of Point is not hidden. */
>     Point     *pointx = PG_GETARG_POINT_P(0);
>     Point     *pointy = PG_GETARG_POINT_P(1);
>     Point     *new_point = (Point *) palloc(sizeof(Point));
>
>     new_point->x = pointx->x;
>     new_point->y = pointy->y;
>
>     PG_RETURN_POINT_P(new_point);
> }
>
> /* by reference, variable length */
>
> PG_FUNCTION_INFO_V1(copytext);
>
> Datum
> copytext(PG_FUNCTION_ARGS)
> {
>     text     *t = PG_GETARG_TEXT_P(0);
>     /*
>      * VARSIZE is the total size of the struct in bytes.
>      */
>     text     *new_t = (text *) palloc(VARSIZE(t));
>     VARATT_SIZEP(new_t) = VARSIZE(t);
>     /*
>      * VARDATA is a pointer to the data region of the struct.
>      */
>     memcpy((void *) VARDATA(new_t), /* destination */
>            (void *) VARDATA(t),     /* source */
>            VARSIZE(t)-VARHDRSZ);    /* how many bytes */
>     PG_RETURN_TEXT_P(new_t);
> }
>
> PG_FUNCTION_INFO_V1(concat_text);
>
> Datum
> concat_text(PG_FUNCTION_ARGS)
> {
>     text  *arg1 = PG_GETARG_TEXT_P(0);
>     text  *arg2 = PG_GETARG_TEXT_P(1);
>     int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
>     text *new_text = (text *) palloc(new_text_size);
>
>     VARATT_SIZEP(new_text) = new_text_size;
>     memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1)-VARHDRSZ);
>     memcpy(VARDATA(new_text) + (VARSIZE(arg1)-VARHDRSZ),
>            VARDATA(arg2), VARSIZE(arg2)-VARHDRSZ);
>   &n bsp; PG_RETURN_TEXT_P(new_text);
> }
>
>
> the error
>
> in function 'makepoint':
> error: 'Point' undeclared (first use in this function)
> error: (each undeclared identifier is reported only one
> error: for each function it appears in.)
> error: 'pointx' undeclared (first use in ´this function)
> error: 'pointy' undeclared (first use in his fnction)
> error 'new_point' undeclared (first use in his function)
> error: syntax error befre ')' oken
> in function 'copy text':
> error: 'invalid lvalue in assinment
> In function 'concat_text'
> error: invalid lvalue in assignement
> warning no new line at end of file
>
> Please any direction of how to solve the problem
>
> thanks
>
> < img alt="">
>
>
>
> ________________________________
> check out the rest of the Windows Live™. More than mail–Windows Live™ goes
> way beyond your inbox. More than messages