On Fri, 30 Aug 2002, Christopher Kings-Lynne wrote:
> 
> --------------------------------
> 
> struct varlena *data;
> char    *word           = "john";
> char    *cur_pos        = NULL;
> int     cur_pos_length  = 0;
> 
> data = (struct varlena *) palloc(VARHDRSZ + column_length + 1);
> word_length = strlen(word);
> cur_pos = &word[word_length - 2];
> 
> while(cur_pos > word)
> {
>       cur_pos_length = strlen(cur_pos);
>       /* Line below causes seg fault on SECOND iteration */
>       data->vl_len = cur_pos_length + sizeof(int32);
>       memcpy(VARDATA(data), cur_pos, cur_pos_length);
>       values[0] = PointerGetDatum(data);
>       values[1] = 0;
>       values[2] = oid;
> 
>       ret = SPI_execp(*(plan->splan), values, NULL, 0);
>       if(ret != SPI_OK_INSERT)
>               elog(ERROR, "Full Text Indexing: error executing plan in insert\n");
> 
>       cur_pos--;
> }
> 

That would imply the SPI_execp call is trashing the value of data. Have you
confirmed that? (Sometimes it helps to confirm exactly where a pointer is
getting hammered.)

column_length is something sensible like word_length I presume.

That sizeof(int32) should really be VARHDRSZ imo, but I can't see how that's
breaking it.

Disclaimer: I have no idea what I'm doing here.


-- 
Nigel J. Andrews


---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

http://archives.postgresql.org

Reply via email to