Implementation of gtrgm_out for gevel

Started by Dmitry Lazurkinover 8 years ago4 messagesgeneral
Jump to latest
#1Dmitry Lazurkin
dilaz03@gmail.com

Hello.

I want use gevel (http://www.sai.msu.su/~megera/wiki/Gevel) for investigation of pg_trgm gist. But for gist_print i need implement 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.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dmitry Lazurkin (#1)
Re: Implementation of gtrgm_out for gevel

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 need implement 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

#3Dmitry Lazurkin
dilaz03@gmail.com
In reply to: Tom Lane (#2)
Re: Implementation of gtrgm_out for gevel

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.

#4Dmitry Lazurkin
dilaz03@gmail.com
In reply to: Tom Lane (#2)
Re: Implementation of gtrgm_out for gevel

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.