Обсуждение: Implementation of gtrgm_out for gevel
Hello. I want use gevel (http://www.sai.msu.su/~megera/wiki/Gevel) for investigation of pg_trgm gist. But for gist_print i needimplement gtrgm_out for pg_trgm gist node. And i have a problem here. ----- My version: PostgreSQL 9.6.6 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609, 64-bit ----- Function: Datum gtrgm_out(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); /* I think entry is pointer to bad memory */ char *result; char buf[1024]; if (entry->leafkey) /* Why leafkey is always true and has strange value? */ { /* This is from gtrgm_compress */ /* text *val = DatumGetTextPP(entry->key); <-- Segfault here */ /* result = strndup(VARDATA_ANY(val), VARSIZE_ANY_EXHDR(val)); */ sprintf(buf, "leafkey %c", entry->leafkey); } else { sprintf(buf, "leafkey %c", entry->leafkey); } result = pstrdup(buf); PG_RETURN_CSTRING(result); } ----- Call gtrgm_out: select * from gist_print('test1_trgm') as t(level int, valid bool, a gtrgm); level | valid | a -------+-------+-------------- 1 | t | leafkey \x7F 2 | t | leafkey \x7F ... 2 | t | leafkey v ... 2 | t | leafkey \x7F ... 2 | t | leafkey v 2 | t | leafkey \x7F ... Can anyone give me some advice? Thanks.
Dmitry Lazurkin <dilaz03@gmail.com> writes: > I want use gevel (http://www.sai.msu.su/~megera/wiki/Gevel) for investigation of pg_trgm gist. But for gist_print i needimplement gtrgm_out for pg_trgm gist node. And i have a problem here. > Datum > gtrgm_out(PG_FUNCTION_ARGS) > { > GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); /* I think entry is pointer to bad memory */ The argument is TRGM *, I think ... certainly not GISTENTRY *. regards, tom lane
On 23.11.2017 21:58, Tom Lane wrote:
> Dmitry Lazurkin <dilaz03@gmail.com> writes:
>> Datum
>> gtrgm_out(PG_FUNCTION_ARGS)
>> {
>> GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); /* I think entry is pointer to bad memory */
> The argument is TRGM *, I think ... certainly not GISTENTRY *.
>
> regards, tom lane
Hmm. I will try to debug gist_print.
On 11/23/2017 09:58 PM, Tom Lane wrote:
> Dmitry Lazurkin <dilaz03@gmail.com> writes:
>> Datum
>> gtrgm_out(PG_FUNCTION_ARGS)
>> {
>> GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); /* I think entry is pointer to bad memory */
> The argument is TRGM *, I think ... certainly not GISTENTRY *.
>
> regards, tom lane
You are right. Thank you.