Search Postgresql Archives

GIN index

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.

```sqlCREATE 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_opsDEFAULT FOR TYPE _geomgrid USING ginAS    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),```
```cDatum geomgrid_in(PG_FUNCTION_ARGS){  char *input = PG_GETARG_CSTRING(0);  int len = strlen(input);  if (len != 16)    PG_RETURN_NULL();
  char *data = palloc(len / 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);}```
```cDatum 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);}```
then i debug it . this is my debug info.


thank you!

PNG image


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]

  Powered by Linux