Re: Implementing an operator in C? - Mailing list pgsql-hackers

From Thomas Lockhart
Subject Re: Implementing an operator in C?
Date
Msg-id 3A8006C9.DBD99DDE@alumni.caltech.edu
Whole thread Raw
In response to Implementing an operator in C?  (Mario Weilguni <mweilguni@sime.com>)
List pgsql-hackers
Mario Weilguni wrote:
> 
> Am Sonntag,  4. Februar 2001 20:12 schrieben Sie:
> > Mario Weilguni <mweilguni@sime.com> writes:
> > >           float8 num3 = numeric_float8(num1);
> >
> > That won't work in the brave new world of 7.1 :-(.  You need to do
> > something like
> >
> >       float8 num3 = DatumGetFloat8(DirectFunctionCall1(numeric_float8,
> >                                       NumericGetDatum(num1)));
> >
> > Ugly, I know ... but we have to be rigidly careful about converting
> > values to Datum and back in order to avoid portability problems.
> >
> > A decent C compiler should've warned about type mismatches in your call,
> > BTW.
> >
> >                       regards, tom lane
> 
> Thanks alot for the info, but the problem is elsewhere. Even a simple
> function like
> Datum
> nef(PG_FUNCTION_ARGS)
> {
>          Numeric                 num1 = PG_GETARG_NUMERIC(0);
>          PG_RETURN_BOOL(true);
> }
> 
> will crash. The macro PG_GETARG_NUMERIC evaluates to:
> ((Numeric)pg_detoast_datum((struct varlena *) ((Pointer) ( (fcinfo->arg[0])))
> and this pg_detoast_datum will lead to a crash (SIGSEGV). So I think I must
> be doing something wrong here, isn't it?

Could be. What data type *is* the input argument? It had better be of
type "NUMERIC", and not of type "FLOAT8", which of course uses a
different accessor function...
                    - Thomas


pgsql-hackers by date:

Previous
From: Thomas Lockhart
Date:
Subject: Re: AW: timestamp in pg_dump
Next
From: Myron Scott
Date:
Subject: Re: Using Threads