]> granicus.if.org Git - postgresql/commitdiff
Fix bug introduced by last patch, thanks again to Mario Weilguni <mweilguni@sime...
authorTeodor Sigaev <teodor@sigaev.ru>
Tue, 8 Aug 2006 15:46:09 +0000 (15:46 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Tue, 8 Aug 2006 15:46:09 +0000 (15:46 +0000)
contrib/ltree/ltree_gist.c

index 2f9e989729b3b99f999ae9194de722c993bb704d..5d5013a6ff6bc9c2f234a66d09b657ee9ce15970 100644 (file)
@@ -460,16 +460,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