]> granicus.if.org Git - postgresql/commitdiff
fix bug about modifying value in shared buffer,
authorTeodor Sigaev <teodor@sigaev.ru>
Mon, 7 Aug 2006 17:42:12 +0000 (17:42 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Mon, 7 Aug 2006 17:42:12 +0000 (17:42 +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 0b0ad9598936fe3e44e4fedb61963018b2e6ddb4..2f9e989729b3b99f999ae9194de722c993bb704d 100644 (file)
@@ -463,27 +463,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
@@ -551,36 +537,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
@@ -677,7 +649,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)
                                :