Skip to content

Commit 6d54320

Browse files
committed
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.
1 parent e002836 commit 6d54320

File tree

1 file changed

+13
-41
lines changed

1 file changed

+13
-41
lines changed

contrib/ltree/ltree_gist.c

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* GiST support for ltree
33
* Teodor Sigaev <teodor@stack.net>
4-
* $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.16 2006/07/11 16:00:44 teodor Exp $
4+
* $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.17 2006/08/07 17:39:04 teodor Exp $
55
*/
66

77
#include "ltree.h"
@@ -459,27 +459,13 @@ gist_isparent(ltree_gist * key, ltree * query)
459459
static bool
460460
gist_ischild(ltree_gist * key, ltree * query)
461461
{
462-
ltree *left = LTG_GETLNODE(key);
463-
ltree *right = LTG_GETRNODE(key);
464-
int4 numlevelL = left->numlevel;
465-
int4 numlevelR = right->numlevel;
466-
bool res = true;
462+
if (ltree_compare(query, LTG_GETLNODE(key)) < 0)
463+
return false;
467464

468-
if (numlevelL > query->numlevel)
469-
left->numlevel = query->numlevel;
465+
if (ltree_compare(query, LTG_GETRNODE(key)) > 0)
466+
return false;
470467

471-
if (ltree_compare(query, left) < 0)
472-
res = false;
473-
474-
if (numlevelR > query->numlevel)
475-
right->numlevel = query->numlevel;
476-
477-
if (res && ltree_compare(query, right) > 0)
478-
res = false;
479-
480-
left->numlevel = numlevelL;
481-
right->numlevel = numlevelR;
482-
return res;
468+
return true;
483469
}
484470

485471
static bool
@@ -547,36 +533,22 @@ gist_tqcmp(ltree * t, lquery * q)
547533
ql = LQL_NEXT(ql);
548534
}
549535

550-
return t->numlevel - q->firstgood;
536+
return Min(t->numlevel, q->firstgood) - q->firstgood;
551537
}
552538

553539
static bool
554540
gist_between(ltree_gist * key, lquery * query)
555541
{
556-
ltree *left = LTG_GETLNODE(key);
557-
ltree *right = LTG_GETRNODE(key);
558-
int4 numlevelL = left->numlevel;
559-
int4 numlevelR = right->numlevel;
560-
bool res = true;
561-
562542
if (query->firstgood == 0)
563543
return true;
564544

565-
if (numlevelL > query->firstgood)
566-
left->numlevel = query->firstgood;
545+
if (gist_tqcmp(LTG_GETLNODE(key), query) > 0)
546+
return false;
567547

568-
if (gist_tqcmp(left, query) > 0)
569-
res = false;
548+
if (gist_tqcmp(LTG_GETRNODE(key), query) < 0)
549+
return false;
570550

571-
if (numlevelR > query->firstgood)
572-
right->numlevel = query->firstgood;
573-
574-
if (res && gist_tqcmp(right, query) < 0)
575-
res = false;
576-
577-
left->numlevel = numlevelL;
578-
right->numlevel = numlevelR;
579-
return res;
551+
return true;
580552
}
581553

582554
static bool
@@ -675,7 +647,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
675647
gist_isparent(key, (ltree *) query);
676648
break;
677649
case 11:
678-
query = PG_GETARG_LTREE_COPY(1);
650+
query = PG_GETARG_LTREE(1);
679651
res = (GIST_LEAF(entry)) ?
680652
inner_isparent(LTG_NODE(key), (ltree *) query)
681653
:

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy