Thread: runtime error on SPGIST, needed help
<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.
"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
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
--
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.
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.