Hi:
I created a new data type, and then I wanted to create a GIN index for it, but when I created the index, the program would crash 。
The version of postgresql is 9.6。
The following is part of the code, and I also refer to the code of intarray.
```sql
CREATE OR REPLACE FUNCTION geomgrid_in(cstring)
RETURNS geomgrid
AS '$libdir/module-1.0','geomgrid_in'
LANGUAGE 'c' NOT FENCED IMMUTABLE STRICT ;
CREATE OR REPLACE FUNCTION geomgrid_out(geomgrid)
RETURNS cstring
AS '$libdir/module-1.0','geomgrid_out'
LANGUAGE 'c' NOT FENCED IMMUTABLE STRICT ;
CREATE OR REPLACE FUNCTION geomgrid_recv(internal)
RETURNS geomgrid
AS '$libdir/module-1.0','geomgrid_recv'
LANGUAGE 'c' NOT FENCED IMMUTABLE STRICT ;
CREATE OR REPLACE FUNCTION geomgrid_send(geomgrid)
RETURNS bytea
AS '$libdir/module-1.0','geomgrid_send'
LANGUAGE 'c' NOT FENCED IMMUTABLE STRICT ;
CREATE TYPE geomgrid(
internallength = 8,
input = geomgrid_in,
output = geomgrid_out,
send = geomgrid_send,
receive = geomgrid_recv,
alignment = double,
PASSEDBYVALUE = true,
storage = plain
);
CREATE OPERATOR CLASS gin_grid_ops
DEFAULT FOR TYPE _geomgrid USING gin
AS
OPERATOR 3 &&,
OPERATOR 6 = (anyarray, anyarray),
OPERATOR 7 @>,
OPERATOR 8 <@,
FUNCTION 1 grid_cmp(geomgrid,geomgrid),
FUNCTION 2 gridarray_extract (anyarray, internal, internal),
FUNCTION 3 gridarray_queryextract (geomgrid, internal, int2, internal, internal, internal, internal),
```
```c
Datum geomgrid_in(PG_FUNCTION_ARGS)
{
char *input = PG_GETARG_CSTRING(0);
int len = strlen(input);
if (len != 16)
PG_RETURN_NULL();
char *data = "" / 2 );
for (int i = 0, j = 7; i < len; i += 2, j--)
{
data[j] = Char2Hex(input + i);
}
int64_t* return_data = (int64_t*)data;
PG_RETURN_INT64(*return_data);
}
Datum geomgrid_out(PG_FUNCTION_ARGS)
{
int64_t out_data = PG_GETARG_INT64(0);
char* buf_data = (char*)(&out_data);
unsigned char dst[2] = {0};
char *result = palloc(16 + 1);
memset(result, 0, 16 + 1);
for (int i = 7, j = 0; i >= 0; i--, j++)
{
Hex2Char((unsigned char)buf_data[i], dst);
result[j * 2 + 1] = dst[0];
result[j * 2] = dst[1];
}
PG_RETURN_CSTRING(result);
}
```
```c
Datum gridarray_extract(PG_FUNCTION_ARGS)
{
ArrayType *array = PG_GETARG_ARRAYTYPE_P_COPY(0);
int size = VARSIZE(array);
int32 *nkeys = (int32 *)PG_GETARG_POINTER(1);
bool **nullFlags = (bool **)PG_GETARG_POINTER(2);
if (array == NULL || nkeys == NULL || nullFlags == NULL)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("Invalid arguments for function gridarray_extract")));
int16 elmlen;
bool elmbyval = false;
char elmalign;
Datum *elems = NULL;
bool *nulls = NULL;
int nelems;
get_typlenbyvalalign(ARR_ELEMTYPE(array), &elmlen, &elmbyval, &elmalign);
deconstruct_array(array, ARR_ELEMTYPE(array), elmlen, elmbyval, elmalign, &elems, &nulls, &nelems);
*nkeys = nelems;
*nullFlags = nulls;
PG_RETURN_POINTER(elems);
}
```