mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
Fix bug corrupting query in gist consistent function.
Thank to Mario Weilguni <mweilguni@sime.com> to discover a bug.
This commit is contained in:
parent
e0bb171960
commit
f446ede326
@ -577,5 +577,6 @@ _ltree_consistent(PG_FUNCTION_ARGS)
|
|||||||
/* internal error */
|
/* internal error */
|
||||||
elog(ERROR, "unrecognized StrategyNumber: %d", strategy);
|
elog(ERROR, "unrecognized StrategyNumber: %d", strategy);
|
||||||
}
|
}
|
||||||
|
PG_FREE_IF_COPY(query,1);
|
||||||
PG_RETURN_BOOL(res);
|
PG_RETURN_BOOL(res);
|
||||||
}
|
}
|
||||||
|
@ -161,8 +161,11 @@ bool compare_subnode(ltree_level * t, char *q, int len,
|
|||||||
ltree *lca_inner(ltree ** a, int len);
|
ltree *lca_inner(ltree ** a, int len);
|
||||||
|
|
||||||
#define PG_GETARG_LTREE(x) ((ltree*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(x))))
|
#define PG_GETARG_LTREE(x) ((ltree*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(x))))
|
||||||
|
#define PG_GETARG_LTREE_COPY(x) ((ltree*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(x))))
|
||||||
#define PG_GETARG_LQUERY(x) ((lquery*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(x))))
|
#define PG_GETARG_LQUERY(x) ((lquery*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(x))))
|
||||||
|
#define PG_GETARG_LQUERY_COPY(x) ((lquery*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(x))))
|
||||||
#define PG_GETARG_LTXTQUERY(x) ((ltxtquery*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(x))))
|
#define PG_GETARG_LTXTQUERY(x) ((ltxtquery*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(x))))
|
||||||
|
#define PG_GETARG_LTXTQUERY_COPY(x) ((ltxtquery*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(x))))
|
||||||
|
|
||||||
/* GiST support for ltree */
|
/* GiST support for ltree */
|
||||||
|
|
||||||
|
@ -622,7 +622,7 @@ Datum
|
|||||||
ltree_consistent(PG_FUNCTION_ARGS)
|
ltree_consistent(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
|
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
|
||||||
char *query = (char *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1)));
|
void *query = NULL;
|
||||||
ltree_gist *key = (ltree_gist *) DatumGetPointer(entry->key);
|
ltree_gist *key = (ltree_gist *) DatumGetPointer(entry->key);
|
||||||
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
|
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
|
||||||
bool res = false;
|
bool res = false;
|
||||||
@ -634,15 +634,18 @@ ltree_consistent(PG_FUNCTION_ARGS)
|
|||||||
switch (strategy)
|
switch (strategy)
|
||||||
{
|
{
|
||||||
case BTLessStrategyNumber:
|
case BTLessStrategyNumber:
|
||||||
|
query = PG_GETARG_LTREE(1);
|
||||||
res = (GIST_LEAF(entry)) ?
|
res = (GIST_LEAF(entry)) ?
|
||||||
(ltree_compare((ltree *) query, LTG_NODE(key)) > 0)
|
(ltree_compare((ltree *) query, LTG_NODE(key)) > 0)
|
||||||
:
|
:
|
||||||
(ltree_compare((ltree *) query, LTG_GETLNODE(key)) >= 0);
|
(ltree_compare((ltree *) query, LTG_GETLNODE(key)) >= 0);
|
||||||
break;
|
break;
|
||||||
case BTLessEqualStrategyNumber:
|
case BTLessEqualStrategyNumber:
|
||||||
|
query = PG_GETARG_LTREE(1);
|
||||||
res = (ltree_compare((ltree *) query, LTG_GETLNODE(key)) >= 0);
|
res = (ltree_compare((ltree *) query, LTG_GETLNODE(key)) >= 0);
|
||||||
break;
|
break;
|
||||||
case BTEqualStrategyNumber:
|
case BTEqualStrategyNumber:
|
||||||
|
query = PG_GETARG_LTREE(1);
|
||||||
if (GIST_LEAF(entry))
|
if (GIST_LEAF(entry))
|
||||||
res = (ltree_compare((ltree *) query, LTG_NODE(key)) == 0);
|
res = (ltree_compare((ltree *) query, LTG_NODE(key)) == 0);
|
||||||
else
|
else
|
||||||
@ -653,21 +656,25 @@ ltree_consistent(PG_FUNCTION_ARGS)
|
|||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case BTGreaterEqualStrategyNumber:
|
case BTGreaterEqualStrategyNumber:
|
||||||
|
query = PG_GETARG_LTREE(1);
|
||||||
res = (ltree_compare((ltree *) query, LTG_GETRNODE(key)) <= 0);
|
res = (ltree_compare((ltree *) query, LTG_GETRNODE(key)) <= 0);
|
||||||
break;
|
break;
|
||||||
case BTGreaterStrategyNumber:
|
case BTGreaterStrategyNumber:
|
||||||
|
query = PG_GETARG_LTREE(1);
|
||||||
res = (GIST_LEAF(entry)) ?
|
res = (GIST_LEAF(entry)) ?
|
||||||
(ltree_compare((ltree *) query, LTG_GETRNODE(key)) < 0)
|
(ltree_compare((ltree *) query, LTG_GETRNODE(key)) < 0)
|
||||||
:
|
:
|
||||||
(ltree_compare((ltree *) query, LTG_GETRNODE(key)) <= 0);
|
(ltree_compare((ltree *) query, LTG_GETRNODE(key)) <= 0);
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
|
query = PG_GETARG_LTREE_COPY(1);
|
||||||
res = (GIST_LEAF(entry)) ?
|
res = (GIST_LEAF(entry)) ?
|
||||||
inner_isparent((ltree *) query, LTG_NODE(key))
|
inner_isparent((ltree *) query, LTG_NODE(key))
|
||||||
:
|
:
|
||||||
gist_isparent(key, (ltree *) query);
|
gist_isparent(key, (ltree *) query);
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
|
query = PG_GETARG_LTREE_COPY(1);
|
||||||
res = (GIST_LEAF(entry)) ?
|
res = (GIST_LEAF(entry)) ?
|
||||||
inner_isparent(LTG_NODE(key), (ltree *) query)
|
inner_isparent(LTG_NODE(key), (ltree *) query)
|
||||||
:
|
:
|
||||||
@ -675,6 +682,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
|
|||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
case 13:
|
case 13:
|
||||||
|
query = PG_GETARG_LQUERY(1);
|
||||||
if (GIST_LEAF(entry))
|
if (GIST_LEAF(entry))
|
||||||
res = DatumGetBool(DirectFunctionCall2(ltq_regex,
|
res = DatumGetBool(DirectFunctionCall2(ltq_regex,
|
||||||
PointerGetDatum(LTG_NODE(key)),
|
PointerGetDatum(LTG_NODE(key)),
|
||||||
@ -685,6 +693,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
|
|||||||
break;
|
break;
|
||||||
case 14:
|
case 14:
|
||||||
case 15:
|
case 15:
|
||||||
|
query = PG_GETARG_LQUERY(1);
|
||||||
if (GIST_LEAF(entry))
|
if (GIST_LEAF(entry))
|
||||||
res = DatumGetBool(DirectFunctionCall2(ltxtq_exec,
|
res = DatumGetBool(DirectFunctionCall2(ltxtq_exec,
|
||||||
PointerGetDatum(LTG_NODE(key)),
|
PointerGetDatum(LTG_NODE(key)),
|
||||||
@ -695,6 +704,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
|
|||||||
break;
|
break;
|
||||||
case 16:
|
case 16:
|
||||||
case 17:
|
case 17:
|
||||||
|
query = DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1)));
|
||||||
if (GIST_LEAF(entry))
|
if (GIST_LEAF(entry))
|
||||||
res = DatumGetBool(DirectFunctionCall2(lt_q_regex,
|
res = DatumGetBool(DirectFunctionCall2(lt_q_regex,
|
||||||
PointerGetDatum(LTG_NODE(key)),
|
PointerGetDatum(LTG_NODE(key)),
|
||||||
@ -707,5 +717,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
|
|||||||
/* internal error */
|
/* internal error */
|
||||||
elog(ERROR, "unrecognized StrategyNumber: %d", strategy);
|
elog(ERROR, "unrecognized StrategyNumber: %d", strategy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PG_FREE_IF_COPY(query,1);
|
||||||
PG_RETURN_BOOL(res);
|
PG_RETURN_BOOL(res);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user