> I have no training in C so I've reached this far by trial and error. I
> have however discovered that if write a function such as
>
> /* pants.c
> weird of what! */
> #include "postgres.h"
> #include "utils/geo_decls.h"
> double
> pants(Point *pt)
> {
> return 2.0;
> }
>
> and compile it as above and make it a function I get:
>
> brecard10=> select id,pos,pants(pos) from points;
> id|pos |pants
> --+-----------+-----
> 1|(1,2) | 1
> 2|(-1.3,4.77)| -1.3
> 3|(0,-3) | 0
> (3 rows)
>
> HELP!
> WHAT'S GOING ON!!!
> Why can't I get to pt->y?
> Why does function pants behave just like get_x (and get_y)?
If you write your function as double, you can't declare it as float in sql. What you wanted is probably this:
#include "postgres.h"
#include "utils/geo_decls.h"
float32 x(Point *pt);
float32 y(Point *pt);
float32 x(Point *pt) {
float32 result = (float32) palloc(sizeof(float32data));
*result = (float)pt->x;
return (result);
}
float32 y(Point *pt) {
float32 result = (float32) palloc(sizeof(float32data));
*result = (float)pt->y;
return (result);
}
(note that float32 is a pointer type)
Then, in sql,
CREATE FUNCTION x(point)
RETURNS float4
AS '/home/postgres/src/point_adts/point_adts.so' <- this is where the above x() and y() functions live
LANGUAGE 'c';
CREATE FUNCTION y(point)
RETURNS float4
AS '/home/postgres/src/point_adts/point_adts.so'
LANGUAGE 'c';
--Gene
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Here's the complete working code:
begin 644 point_adts.tgz
M'XL(`&4!6#<``^V5\6^:0!3'_;7W5[QH$\$I@@IN-BZQ%AL7JIWHTM\:"H=E
M0XYRF-0MV]^^0T5L8]NDL2[-[A,3\+Z/]^[NO7<7$B^(KRTGIM7<6P$-N:FJ
MD`,`I9$^&\OG&AE`:];49K.I:AI3:XU:/0?JF\UHBSF-K0@@%Q(:3R-,G[;#
MT9/B^R7,\G]A_<"NY^.]QU!D65OG>V?^FXJ:YK\F*_5$56I*#N2]SV0'_WG^
MS5'WK#]J0W5.HRJ-[&HXI7?^\@UY@>W/';Q+2VM%FOKDQO(1ZO:,SKGYH0V5
M_K%@]$\OOS*W(OLG257V6[M"J(`*<&8,3[^8X%&(;S$XB\":>;;E^XN*3RP'
M.T!NOF,[AB0`E0#&S"KOS@.;YN%NCB,/4^8EG5UWI'?&.O0F@^ZX/QPD3JT8
M$D\0D7GL!9B"&Y%9$HSBM5,VC]4LVI!UP+%P9IB37J]_)0)"GNM@%_2KRV1H
M;<W6EQ@EKRV)M(^%M2R*"`>.YR+$EM':V(@(;5Y;6X$D@HZFM@T5>FM%;+T5
MLBU2\M`4V3ZV@A8ZBF90<;><KP=*$H'2'R@5T"ORO]7_7L!:P?<EEN/]UMA+
M_:^J2G;^R\GYW]"T&N__0_"H>^!>6%:$B$;Z>#(:F."R3HH;J&-"L7I+9KB:
M;M3J1,C*YT$%%Y'1&9Q/.N<Z%.WB"3L?'L59O&V<<>?4T"$$(5SUDLBD_L#4
M1V/H#\9#IGSK&!/=%(J"7%;%(M.?D"M*67M.5R6U_$GZN#1!R-0-O3M.=E$L
M)VL4H3<:7D!X\IK>/`2[-];>:XR7^E_+[O]FHU%CJBK+==[_AZ"07J/Y=`.D
MVSS*1MD%ZM/J%)-K!]O^4D3+5JVS/+$ZOTR*!DIATF'9^.+!^$;8-H=?*,U_
M*K/@<S^&-@CK$1%"=B$16Z#>3TS<=-BQ8DM,_*8.2H^^%,.X\OG^9*-'.)Y'
M`0@K,_;E[VQ.BT/.:?'\G/YU,7`X'`Z'P^%P.!P.A\/A<#@<#H?#X7#>/7\!
(A%`/L@`H````
`
end