Hello everybody,
I am quite a novice in using the extension features of the PostgreSQL database.
Actually, I have to do this for work at the university. At the moment, I am
trying around a little bit with creating my own types using shared objects,
written in C. The usage of static types with fixed length was actually no
problem for me, so I proceeded to variable length types.
I created an n-dimensional point structure called "PointND" that contains a
field of float8 values of dynamic length. I also put in a int4/int32 field for
the length specification, as required by the documentation. So the structure
looks like the following:
struct PointND
{
int32 dimensions;
float8 coordinates[1];
};
I hope, that at least this layout is as it is required. Together with this
type, I also provide the required in and out functions to convert the structure
to the internal/external representation properly.
The in/out functions work properly when giving the following statement (I also
tried it using a debugger):
select '(4,5,6)'::pointnd;
pointnd
--------------------------------
(4.000000, 5.000000, 6.000000)
(1 row)
So it seems, that at least these functions do what they are supposed to.
The problem I have is that if I now create a table that should store entries of
the type pointnd, it won't store them actually. If I do an insert like the
following:
insert into test (point) values ('(5,16,6)'::pointnd);
INSERT 0 1
I get the feedback that one new row has been created. Actually this row has
been created and the in function is also called (I also checked this using the
debugger). Now, I would have expected something like the following, when
querying the table:
select * from test;
point
--------------------------------
(5.000000, 16.000000, 6.000000)
But, actually I get the following:
select * from test;
point
--------------------------------
(0.000000, 0.000000, 0.000000)
The SQL-Script used to create the type can be seen here:
CREATE TYPE pointnd(
INTERNALLENGTH = VARIABLE,
ALIGNMENT=DOUBLE,
INPUT=pointnd_in,
OUTPUT=pointnd_out,
RECEIVE=pointnd_recv,
SEND=pointnd_send,
STORAGE=PLAIN
);
I played around with the parameters a little bit, but still don't know where
this behaviour comes from. Actually, I was thinking that I conform to the
requirements given by Postgres after having read the documentation. Storage
type set to another method (like MAIN) will result in a segmentation fault,
though.
I would be very glad, if somebody could provide me some help to this issue
because I could proceed with my "actual" work, after that.
Thank you in advance
Best regards
Carsten Kropf