Fix bug introduced by last patch, thanks again to Mario Weilguni
authorTeodor Sigaev
Tue, 8 Aug 2006 15:45:18 +0000 (15:45 +0000)
committerTeodor Sigaev
Tue, 8 Aug 2006 15:45:18 +0000 (15:45 +0000)
contrib/ltree/ltree_gist.c

index b4d89abe13114fa90c863df946aedb512d5f8a5e..5cfddd7634059f7a396d61792a36e537439b5a87 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * GiST support for ltree
  * Teodor Sigaev 
- * $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