aboutsummaryrefslogtreecommitdiff
path: root/contrib/ltree/ltree_gist.c
diff options
context:
space:
mode:
authorTeodor Sigaev <teodor@sigaev.ru>2006-08-07 17:40:53 +0000
committerTeodor Sigaev <teodor@sigaev.ru>2006-08-07 17:40:53 +0000
commit9a7788fb4d9eecd44c87cb69d2b52512e804c5a7 (patch)
tree483993c485dc90ae0c4e512608cffebd73b7fa9c /contrib/ltree/ltree_gist.c
parent632db651cb59cf6065d31e152e773657d495aaed (diff)
downloadpostgresql-9a7788fb4d9eecd44c87cb69d2b52512e804c5a7.tar.gz
postgresql-9a7788fb4d9eecd44c87cb69d2b52512e804c5a7.zip
fix bug about modifying value in shared buffer,
what was a reason to corrupt index. Thank to Mario Weilguni <mweilguni@sime.com> to discover a bug.
Diffstat (limited to 'contrib/ltree/ltree_gist.c')
-rw-r--r--contrib/ltree/ltree_gist.c52
1 files changed, 12 insertions, 40 deletions
diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c
index 5a6aa94e91c..42348e6e11d 100644
--- a/contrib/ltree/ltree_gist.c
+++ b/contrib/ltree/ltree_gist.c
@@ -462,27 +462,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
@@ -550,36 +536,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
@@ -678,7 +650,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)
: