11/*
22 * GiST support for ltree
33 * Teodor Sigaev <teodor@stack.net>
4- * $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.15 2006/06/28 11:59:59 teodor Exp $
4+ * $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.16 2006/07/11 16:00:44 teodor Exp $
55 */
66
77#include "ltree.h"
@@ -627,23 +627,26 @@ Datum
627627ltree_consistent (PG_FUNCTION_ARGS )
628628{
629629GISTENTRY * entry = (GISTENTRY * )PG_GETARG_POINTER (0 );
630- char * query = ( char * ) DatumGetPointer ( PG_DETOAST_DATUM ( PG_GETARG_DATUM ( 1 ))) ;
630+ void * query = NULL ;
631631ltree_gist * key = (ltree_gist * )DatumGetPointer (entry -> key );
632632StrategyNumber strategy = (StrategyNumber )PG_GETARG_UINT16 (2 );
633633bool res = false;
634634
635635switch (strategy )
636636{
637637case BTLessStrategyNumber :
638+ query = PG_GETARG_LTREE (1 );
638639res = (GIST_LEAF (entry )) ?
639640(ltree_compare ((ltree * )query ,LTG_NODE (key ))> 0 )
640641:
641642(ltree_compare ((ltree * )query ,LTG_GETLNODE (key )) >=0 );
642643break ;
643644case BTLessEqualStrategyNumber :
645+ query = PG_GETARG_LTREE (1 );
644646res = (ltree_compare ((ltree * )query ,LTG_GETLNODE (key )) >=0 );
645647break ;
646648case BTEqualStrategyNumber :
649+ query = PG_GETARG_LTREE (1 );
647650if (GIST_LEAF (entry ))
648651res = (ltree_compare ((ltree * )query ,LTG_NODE (key ))== 0 );
649652else
@@ -654,28 +657,33 @@ ltree_consistent(PG_FUNCTION_ARGS)
654657);
655658break ;
656659case BTGreaterEqualStrategyNumber :
660+ query = PG_GETARG_LTREE (1 );
657661res = (ltree_compare ((ltree * )query ,LTG_GETRNODE (key )) <=0 );
658662break ;
659663case BTGreaterStrategyNumber :
664+ query = PG_GETARG_LTREE (1 );
660665res = (GIST_LEAF (entry )) ?
661666(ltree_compare ((ltree * )query ,LTG_GETRNODE (key ))< 0 )
662667:
663668(ltree_compare ((ltree * )query ,LTG_GETRNODE (key )) <=0 );
664669break ;
665670case 10 :
671+ query = PG_GETARG_LTREE_COPY (1 );
666672res = (GIST_LEAF (entry )) ?
667673inner_isparent ((ltree * )query ,LTG_NODE (key ))
668674:
669675gist_isparent (key , (ltree * )query );
670676break ;
671677case 11 :
678+ query = PG_GETARG_LTREE_COPY (1 );
672679res = (GIST_LEAF (entry )) ?
673680inner_isparent (LTG_NODE (key ), (ltree * )query )
674681:
675682gist_ischild (key , (ltree * )query );
676683break ;
677684case 12 :
678685case 13 :
686+ query = PG_GETARG_LQUERY (1 );
679687if (GIST_LEAF (entry ))
680688res = DatumGetBool (DirectFunctionCall2 (ltq_regex ,
681689PointerGetDatum (LTG_NODE (key )),
@@ -686,6 +694,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
686694break ;
687695case 14 :
688696case 15 :
697+ query = PG_GETARG_LQUERY (1 );
689698if (GIST_LEAF (entry ))
690699res = DatumGetBool (DirectFunctionCall2 (ltxtq_exec ,
691700PointerGetDatum (LTG_NODE (key )),
@@ -696,6 +705,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
696705break ;
697706case 16 :
698707case 17 :
708+ query = DatumGetPointer (PG_DETOAST_DATUM (PG_GETARG_DATUM (1 )));
699709if (GIST_LEAF (entry ))
700710res = DatumGetBool (DirectFunctionCall2 (lt_q_regex ,
701711PointerGetDatum (LTG_NODE (key )),
@@ -708,5 +718,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
708718/* internal error */
709719elog (ERROR ,"unrecognized StrategyNumber: %d" ,strategy );
710720}
721+
722+ PG_FREE_IF_COPY (query ,1 );
711723PG_RETURN_BOOL (res );
712724}