]> granicus.if.org Git - postgresql/commitdiff
fix bug about modifying value in shared buffer,
authorTeodor Sigaev <teodor@sigaev.ru>
Mon, 7 Aug 2006 17:39:04 +0000 (17:39 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Mon, 7 Aug 2006 17:39:04 +0000 (17:39 +0000)
what was a reason to corrupt index.
Thank to Mario Weilguni <mweilguni@sime.com> to
discover a bug.

contrib/ltree/ltree_gist.c

index d63b25f2cdfacdfa627807e77feba3f6479d2447..b4d89abe13114fa90c863df946aedb512d5f8a5e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * GiST support for ltree
  * Teodor Sigaev <teodor@stack.net>
- * $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.16 2006/07/11 16:00:44 teodor Exp $
+ * $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.17 2006/08/07 17:39:04 teodor Exp $
  */
 
 #include "ltree.h"
@@ -459,27 +459,13 @@ gist_isparent(ltree_gist * key, ltree * query)
 static bool
 gist_ischild(ltree_gist * key, ltree * query)
 {
-       ltree      *left = LTG_GETLNODE(key);
-       ltree      *right = LTG_GETRNODE(key);
-       int4            numlevelL = left->numlevel;
-       int4            numlevelR = right->numlevel;
-       bool            res = true;
+       if (ltree_compare(query, LTG_GETLNODE(key)) < 0)
+               return false;
 
-       if (numlevelL > query->numlevel)
-               left->numlevel = query->numlevel;
+       if (ltree_compare(query, LTG_GETRNODE(key)) > 0)
+               return false;
 
-       if (ltree_compare(query, left) < 0)
-               res = false;
-
-       if (numlevelR > query->numlevel)
-               right->numlevel = query->numlevel;
-
-       if (res && ltree_compare(query, right) > 0)
-               res = false;
-
-       left->numlevel = numlevelL;
-       right->numlevel = numlevelR;
-       return res;
+       return true;
 }
 
 static bool
@@ -547,36 +533,22 @@ gist_tqcmp(ltree * t, lquery * q)
                ql = LQL_NEXT(ql);
        }
 
-       return t->numlevel - q->firstgood;
+       return Min(t->numlevel, q->firstgood) - q->firstgood;
 }
 
 static bool
 gist_between(ltree_gist * key, lquery * query)
 {
-       ltree      *left = LTG_GETLNODE(key);
-       ltree      *right = LTG_GETRNODE(key);
-       int4            numlevelL = left->numlevel;
-       int4            numlevelR = right->numlevel;
-       bool            res = true;
-
        if (query->firstgood == 0)
                return true;
 
-       if (numlevelL > query->firstgood)
-               left->numlevel = query->firstgood;
+       if (gist_tqcmp(LTG_GETLNODE(key), query) > 0)
+               return false;
 
-       if (gist_tqcmp(left, query) > 0)
-               res = false;
+       if (gist_tqcmp(LTG_GETRNODE(key), query) < 0)
+               return false;
 
-       if (numlevelR > query->firstgood)
-               right->numlevel = query->firstgood;
-
-       if (res && gist_tqcmp(right, query) < 0)
-               res = false;
-
-       left->numlevel = numlevelL;
-       right->numlevel = numlevelR;
-       return res;
+       return true;
 }
 
 static bool
@@ -675,7 +647,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
                                gist_isparent(key, (ltree *) query);
                        break;
                case 11:
-                       query = PG_GETARG_LTREE_COPY(1);
+                       query = PG_GETARG_LTREE(1);
                        res = (GIST_LEAF(entry)) ?
                                inner_isparent(LTG_NODE(key), (ltree *) query)
                                :