Обсуждение: runtime error on SPGIST, needed help

Поиск
Список
Период
Сортировка

runtime error on SPGIST, needed help

От
"Simone Campora"
Дата:
<br clear="all" />Hello to all of you! I'm new of this newsletter but I hope that this is the good place to send this
helprequest!<br />I'm a student and I'm developing a quadtree index using postgresql 8.0.15 under Linux Ubuntu  7.10
GustyGibbon, but I have the following problem:<br /><br />I downloaded the GIST extension SPGIST from the website <a
href="http://www.cs.purdue.edu/spgist/">http://www.cs.purdue.edu/spgist/</a><br/><br />and I tried to modify some C
functionsused by the operators (for instance the == used between Point and Point)<br /><br /><span
class="gmail_quote"><spanclass="gmail_sendername">here there is a function in the ./spgist-pquad/spgist_pquad.cc that
is:<br/><br /><span style="font-style: italic;">SPGIST_FUNCTION(pquad_equals_op)  </span><br style="font-style:
italic;"/><span style="font-style: italic;">{</span><br style="font-style: italic;" /><span style="font-style:
italic;">       PG_RETURN_BOOL(true);</span><br style="font-style: italic;" /><span style="font-style:
italic;">}</span><br/><br />That is the one that is used by the operator == defined as follows:<br /><br />CREATE OR
REPLACEFUNCTION pquad_equals_op(point,point) RETURNS bool AS '/usr/local/lib/libspgist_pquad' LANGUAGE 'C';<br />CREATE
OPERATOR== ( LEFTARG = point, RIGHTARG = point, PROCEDURE = pquad_equals_op, RESTRICT = eqsel, JOIN = eqjoinsel);<br
/><br/>I first want to implement it and to make it works, like this:<br /><br style="font-style: italic;" /><span
style="font-style:italic;">SPGIST_FUNCTION(pquad_equals_op)  </span><br style="font-style: italic;" /><span
style="font-style:italic;">{</span><br style="font-style: italic;" /><span style="font-style: italic;">    elog
(NOTICE,"1");</span><br style="font-style: italic;" /><br style="font-style: italic;" /><span style="font-style:
italic;">   Point *p1 = (Point *)PG_GETARG_POINTER(0);</span><br style="font-style: italic;" /><span style="font-style:
italic;">   Point *p2 = (Point *)PG_GETARG_POINTER(1);<br /><br style="font-style: italic;" /></span><span
style="font-style:italic;">    elog (NOTICE, "2");<br /><br style="font-style: italic;" /></span><span
style="font-style:italic;">    if((p1->x == p2->x) && (p1->y == p2->y))</span><br
style="font-style:italic;" /><span style="font-style: italic;">    {</span><br style="font-style: italic;" /><span
style="font-style:italic;">        PG_RETURN_BOOL(true);</span><br style="font-style: italic;" /><span
style="font-style:italic;">    }</span><br style="font-style: italic;" /><span style="font-style: italic;">   
else</span><brstyle="font-style: italic;" /><span style="font-style: italic;">    {</span><br style="font-style:
italic;"/><span style="font-style: italic;">        PG_RETURN_BOOL(false);</span><br style="font-style: italic;"
/><spanstyle="font-style: italic;">    }</span><br style="font-style: italic;" /><span style="font-style:
italic;"> </span><brstyle="font-style: italic;" /><span style="font-style: italic;">}</span><br /><br />I can compile
itwithout problem but when I use that operator in a sql query like:<br /><br style="font-style: italic;"
/></span></span><spanclass="gmail_quote" style="font-style: italic;"><span class="gmail_sendername">select * from
tablepoints p1 where p1.point == '(1,1)';</span></span><br /><span class="gmail_quote"><span
class="gmail_sendername"><br/> then the process simply crash by signal 11 and without any useful feedback on the
motivation(it just prints out the notice "1" and "2").<br />Is that an already known problem? Honestly I found it very
hardto discover the problem and I still don't have a solution.</span></span><br /><br /><br />Could anyone suggest me a
goodruntime debugger for that purpose?<br /><br />Thanks to all of you!!<br /><br />Simone<br /><br /><br /><br />--
<br/>Campora Simone,<br />________________________<br />School of computer science<br />Swiss Federal Institute of
Technology,Lausanne<br /> EPFL<br /><br />E-MAIL: <a
href="mailto:simone.campora@gmail.com">simone.campora@gmail.com</a><br/>             simone.campora@epfl.ch<br /><br
/>WWW:<a href="http://www.simonecampora.com">www.simonecampora.com</a><br /><br />MOBILE:  +41 762 563466<br />
              +39 347 8036605<br /><br />SKYPE: sim0ne.  

Re: runtime error on SPGIST, needed help

От
Tom Lane
Дата:
"Simone Campora" <simone.campora@gmail.com> writes:
> I first want to implement it and to make it works, like this:

> SPGIST_FUNCTION(pquad_equals_op)
> {
>     elog (NOTICE, "1");

>     Point *p1 = (Point *)PG_GETARG_POINTER(0);
>     Point *p2 = (Point *)PG_GETARG_POINTER(1);

>     elog (NOTICE, "2");

(1) are you sure this function is marked as being V1 calling convention?
Maybe "SPGIST_FUNCTION" takes care of that for you but I don't know.

(2) since you neither marked it STRICT nor defended against nulls in the
function body, I'd fully expect a crash on a null input ... does that
table contain any null points?

> Could anyone suggest me a good runtime debugger for that purpose?

Any C debugger should work fine.  gdb and ddd are the most common
tools around this project, I think.
        regards, tom lane


Re: runtime error on SPGIST, needed help

От
"Simone Campora"
Дата:
Hello and really thanks for the answer, I found the solution for the problem also thanks to the gdb debugger. My problem was a SegmentationFault runtime error due to a little tricky:

the function SPGIST_FUNCTION(pquad_equals_op) is defined as follows

#define SPGIST_FUNCTION(name) extern "C" Datum name(PG_FUNCTION_ARGS)
 
 
extern "C" {
PG_FUNCTION_INFO_V1(pquad_consistent);
PG_FUNCTION_INFO_V1(pquad_nn_consistent);
PG_FUNCTION_INFO_V1(pquad_penalty);
PG_FUNCTION_INFO_V1(pquad_checkinternalsplit);
PG_FUNCTION_INFO_V1(pquad_picksplit);
PG_FUNCTION_INFO_V1(pquad_childbp);
PG_FUNCTION_INFO_V1(pquad_keylen);
PG_FUNCTION_INFO_V1(pquad_check);
PG_FUNCTION_INFO_V1(pquad_printpred);
PG_FUNCTION_INFO_V1(pquad_getpred);
PG_FUNCTION_INFO_V1(pquad_getparam);
PG_FUNCTION_INFO_V1(pquad_inside_op);
PG_FUNCTION_INFO_V1(pquad_check_chaining); 
}

but as you can see, this "C" lacks the row

PG_FUNCTION_INFO_V1(pquad_equals_op);

that's why it was not working... I didn't noticed it because as far as I don't access any pointer's argument, I don't get any error back! (I really don't know why, is it maybe because of some default setting?)

Anyway thanks again to all!

Simone



On 12/04/2008, Tom Lane <tgl@sss.pgh.pa.us> wrote:
"Simone Campora" <simone.campora@gmail.com> writes:
> I first want to implement it and to make it works, like this:

> SPGIST_FUNCTION(pquad_equals_op)
> {
>     elog (NOTICE, "1");

>     Point *p1 = (Point *)PG_GETARG_POINTER(0);
>     Point *p2 = (Point *)PG_GETARG_POINTER(1);

>     elog (NOTICE, "2");


(1) are you sure this function is marked as being V1 calling convention?
Maybe "SPGIST_FUNCTION" takes care of that for you but I don't know.

(2) since you neither marked it STRICT nor defended against nulls in the
function body, I'd fully expect a crash on a null input ... does that
table contain any null points?


> Could anyone suggest me a good runtime debugger for that purpose?


Any C debugger should work fine.  gdb and ddd are the most common
tools around this project, I think.

                        regards, tom lane



--
Campora Simone,
________________________
School of computer science
Swiss Federal Institute of Technology, Lausanne
EPFL

E-MAIL: simone.campora@gmail.com
             simone.campora@epfl.ch

WWW: www.simonecampora.com

MOBILE:  +41 762 563466
               +39 347 8036605

SKYPE: sim0ne.