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:

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);

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;

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);
}

(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

Reply via email to