summaryrefslogtreecommitdiff
path: root/contrib/ltree/ltree_gist.c
diff options
context:
space:
mode:
authorTeodor Sigaev2006-08-08 15:45:18 +0000
committerTeodor Sigaev2006-08-08 15:45:18 +0000
commite7d490f91d204073eab6dfdaa031414e19dd705a (patch)
tree968114e2d37e5e763b4c25080febf2f95a5a4f07 /contrib/ltree/ltree_gist.c
parent79a1a2ec6b8acd0aee98105cb2cd9e61e4426290 (diff)
Fix bug introduced by last patch, thanks again to Mario Weilguni <[email protected]>
Diffstat (limited to 'contrib/ltree/ltree_gist.c')
-rw-r--r--contrib/ltree/ltree_gist.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c
index b4d89abe131..5cfddd76340 100644
--- a/contrib/ltree/ltree_gist.c
+++ b/contrib/ltree/ltree_gist.c
@@ -1,7 +1,7 @@
/*
* GiST support for ltree
* Teodor Sigaev <[email protected]>
- * $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.17 2006/08/07 17:39:04 teodor Exp $
+ * $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.18 2006/08/08 15:45:18 teodor Exp $
*/
#include "ltree.h"
@@ -456,16 +456,36 @@ gist_isparent(ltree_gist * key, ltree * query)
return false;
}
+static ltree *
+copy_ltree( ltree *src ) {
+ ltree *dst = (ltree*)palloc(src->len);
+ memcpy(dst, src, src->len);
+ return dst;
+}
+
static bool
gist_ischild(ltree_gist * key, ltree * query)
{
- if (ltree_compare(query, LTG_GETLNODE(key)) < 0)
- return false;
+ ltree *left = copy_ltree(LTG_GETLNODE(key));
+ ltree *right = copy_ltree(LTG_GETRNODE(key));
+ bool res = true;
- if (ltree_compare(query, LTG_GETRNODE(key)) > 0)
- return false;
+ if (left->numlevel > query->numlevel)
+ left->numlevel = query->numlevel;
- return true;
+ if (ltree_compare(query, left) < 0)
+ res = false;
+
+ if (right->numlevel > query->numlevel)
+ right->numlevel = query->numlevel;
+
+ if (res && ltree_compare(query, right) > 0)
+ res = false;
+
+ pfree(left);
+ pfree(right);
+
+ return res;
}
static bool