postgres.git / summary / log / commit / refs

commit    2b3d2717c4c3bc8e8a6656fbb614dde82f6265fd
Author:   Teodor Sigaev <teodor@sigaev.ru>
Date:     Tue Aug 08 15:46:31 2006 +0000
First released in: 8.2.0, 7.3.16, 7.4.14, 8.0.9, 8.1.5

    Fix bug introduced by last patch, thanks again to Mario Weilguni <mweilguni@sime.com>


contrib/ltree/ltree_gist.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c index 1914d8a49b4..f33b74ad33a 100644 --- a/contrib/ltree/ltree_gist.c +++ b/contrib/ltree/ltree_gist.c @@ -454,16 +454,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 [parent: 3da93a0a3bac]