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