From: | "huangning290(at)yahoo(dot)com" <huangning290(at)yahoo(dot)com> |
---|---|
To: | "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org> |
Subject: | GIN index |
Date: | 2021-10-11 08:00:53 |
Message-ID: | 1301689812.1073475.1633939253216@mail.yahoo.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
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!
Attachment | Content-Type | Size |
---|---|---|
f71916d7254ff236aef8f26efffcfb3.png | image/png | 507.8 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Laurenz Albe | 2021-10-11 08:08:43 | Re: Error: server closed the connection unexpectedly |
Previous Message | Ken Wang | 2021-10-11 04:17:06 |