mirror of
https://github.com/postgres/postgres.git
synced 2025-04-20 00:42:27 +03:00
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.
This commit is contained in:
parent
3c3c610c57
commit
3da93a0a3b
@ -457,27 +457,13 @@ gist_isparent(ltree_gist * key, ltree * query)
|
|||||||
static bool
|
static bool
|
||||||
gist_ischild(ltree_gist * key, ltree * query)
|
gist_ischild(ltree_gist * key, ltree * query)
|
||||||
{
|
{
|
||||||
ltree *left = LTG_GETLNODE(key);
|
if (ltree_compare(query, LTG_GETLNODE(key)) < 0)
|
||||||
ltree *right = LTG_GETRNODE(key);
|
return false;
|
||||||
int4 numlevelL = left->numlevel;
|
|
||||||
int4 numlevelR = right->numlevel;
|
|
||||||
bool res = true;
|
|
||||||
|
|
||||||
if (numlevelL > query->numlevel)
|
if (ltree_compare(query, LTG_GETRNODE(key)) > 0)
|
||||||
left->numlevel = query->numlevel;
|
return false;
|
||||||
|
|
||||||
if (ltree_compare(query, left) < 0)
|
return true;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
@ -545,36 +531,22 @@ gist_tqcmp(ltree * t, lquery * q)
|
|||||||
ql = LQL_NEXT(ql);
|
ql = LQL_NEXT(ql);
|
||||||
}
|
}
|
||||||
|
|
||||||
return t->numlevel - q->firstgood;
|
return Min(t->numlevel, q->firstgood) - q->firstgood;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
gist_between(ltree_gist * key, lquery * query)
|
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)
|
if (query->firstgood == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (numlevelL > query->firstgood)
|
if (gist_tqcmp(LTG_GETLNODE(key), query) > 0)
|
||||||
left->numlevel = query->firstgood;
|
return false;
|
||||||
|
|
||||||
if (gist_tqcmp(left, query) > 0)
|
if (gist_tqcmp(LTG_GETRNODE(key), query) < 0)
|
||||||
res = false;
|
return false;
|
||||||
|
|
||||||
if (numlevelR > query->firstgood)
|
return true;
|
||||||
right->numlevel = query->firstgood;
|
|
||||||
|
|
||||||
if (res && gist_tqcmp(right, query) < 0)
|
|
||||||
res = false;
|
|
||||||
|
|
||||||
left->numlevel = numlevelL;
|
|
||||||
right->numlevel = numlevelR;
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
@ -653,7 +625,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
|
|||||||
gist_isparent(key, (ltree *) query);
|
gist_isparent(key, (ltree *) query);
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
query = PG_GETARG_LTREE_COPY(1);
|
query = PG_GETARG_LTREE(1);
|
||||||
res = (GIST_LEAF(entry)) ?
|
res = (GIST_LEAF(entry)) ?
|
||||||
inner_isparent(LTG_NODE(key), (ltree *) query)
|
inner_isparent(LTG_NODE(key), (ltree *) query)
|
||||||
:
|
:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user