diff options
author | Teodor Sigaev <teodor@sigaev.ru> | 2006-08-07 17:40:53 +0000 |
---|---|---|
committer | Teodor Sigaev <teodor@sigaev.ru> | 2006-08-07 17:40:53 +0000 |
commit | 9a7788fb4d9eecd44c87cb69d2b52512e804c5a7 (patch) | |
tree | 483993c485dc90ae0c4e512608cffebd73b7fa9c /contrib/ltree/ltree_gist.c | |
parent | 632db651cb59cf6065d31e152e773657d495aaed (diff) | |
download | postgresql-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.c | 52 |
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) : |