postgres.git / summary / log / commit / refs
commit 2b3d2717c4c3bc8e8a6656fbb614dde82f6265fd
Author: Teodor Sigaev <teodor@sigaev.ru>
Date: Tue Aug 08 15:46:31 2006 +0000
First released in: 8.2.0, 7.3.16, 7.4.14, 8.0.9, 8.1.5
Fix bug introduced by last patch, thanks again to Mario Weilguni <mweilguni@sime.com>
contrib/ltree/ltree_gist.c | 30 +++++++++++++++++++++++++-----
1 file changed, 25 insertions(+), 5 deletions(-)
diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c
index 1914d8a49b4..f33b74ad33a 100644
--- a/contrib/ltree/ltree_gist.c
+++ b/contrib/ltree/ltree_gist.c
@@ -454,16 +454,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
[parent: 3da93a0a3bac]