I am defining a new type, FooBar, and trying to create a GIN index for it. Everything is working well without the index. FooBar values are getting into a table, and being retrieved and selected correctly. But I'm getting a crash when I add a GIN index on a column of type FooBar.
Here is the operator class:
Here is the postgres function for extracting keys from FooBar values:
And the implementation:
(Eventually there will be multiple keys, so it really does need to be a GIN index.)
I have used ereport debugging to prove that the FooBar delivered into foobar_item_to_keys is correct, and that the PG_RETURN_POINTER statement is being reached.
I have been reading the Postgres docs, and comparing my code to the examples in contrib, and cannot see what I'm doing wrong. Can anyone see a problem in what I've described? Or point me in the right direction to debug this problem?
Thanks.
Jack Orenstein
Here is the operator class:
create operator class foobar_ops
default for type foobar using gin
as
operator 1 @@,
function 1 foobar_cmp(bigint, bigint),
function 2 foobar_item_to_keys(foobar, internal),
function 3 foobar_query_to_keys(foobar, internal, int2, internal, internal),
function 4 foobar_match(internal, int2, anyelement, int4, internal, internal),
function 5 foobar_partial_match(foobar, foobar, int2, internal);
default for type foobar using gin
as
operator 1 @@,
function 1 foobar_cmp(bigint, bigint),
function 2 foobar_item_to_keys(foobar, internal),
function 3 foobar_query_to_keys(foobar, internal, int2, internal, internal),
function 4 foobar_match(internal, int2, anyelement, int4, internal, internal),
function 5 foobar_partial_match(foobar, foobar, int2, internal);
Here is the postgres function for extracting keys from FooBar values:
create function foobar_item_to_keys(foobar, internal) returns internal
as '$libdir/foobar'
language C immutable strict parallel safe;
as '$libdir/foobar'
language C immutable strict parallel safe;
And the implementation:
Datum foobar_item_to_keys(PG_FUNCTION_ARGS)
{
FooBar* foobar = (FooBar*) DatumGetPointer(PG_GETARG_DATUM(0));
int32* n_keys = (int32*) PG_GETARG_POINTER(1);
int64_t* keys = (int64_t*) palloc(sizeof(int64_t));
*n_keys = 1;
keys[0] = foobar->key0;
PG_RETURN_POINTER(keys);
}
{
FooBar* foobar = (FooBar*) DatumGetPointer(PG_GETARG_DATUM(0));
int32* n_keys = (int32*) PG_GETARG_POINTER(1);
int64_t* keys = (int64_t*) palloc(sizeof(int64_t));
*n_keys = 1;
keys[0] = foobar->key0;
PG_RETURN_POINTER(keys);
}
(Eventually there will be multiple keys, so it really does need to be a GIN index.)
I have used ereport debugging to prove that the FooBar delivered into foobar_item_to_keys is correct, and that the PG_RETURN_POINTER statement is being reached.
I have been reading the Postgres docs, and comparing my code to the examples in contrib, and cannot see what I'm doing wrong. Can anyone see a problem in what I've described? Or point me in the right direction to debug this problem?
Thanks.
Jack Orenstein