Re: Implementing an operator in C?
От | Thomas Lockhart |
---|---|
Тема | Re: Implementing an operator in C? |
Дата | |
Msg-id | 3A8006C9.DBD99DDE@alumni.caltech.edu обсуждение исходный текст |
Ответ на | Implementing an operator in C? (Mario Weilguni <mweilguni@sime.com>) |
Список | 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 по дате отправления: