1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-08 06:02:22 +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:
Teodor Sigaev
2006-07-11 16:11:06 +00:00
parent 4587cd4280
commit 79aabd140d
3 changed files with 16 additions and 1 deletions

View File

@@ -609,6 +609,7 @@ gist_qe(ltree_gist * key, lquery * query)
curq = LQL_NEXT(curq); curq = LQL_NEXT(curq);
qlen--; qlen--;
} }
PG_FREE_IF_COPY(query,1);
return true; return true;
} }

View File

@@ -167,8 +167,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 */

View File

@@ -601,7 +601,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;
@@ -613,15 +613,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
@@ -632,21 +635,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)
: :
@@ -654,6 +661,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)),
@@ -664,6 +672,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)),
@@ -675,5 +684,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
default: default:
elog(ERROR, "Unknown StrategyNumber: %d", strategy); elog(ERROR, "Unknown StrategyNumber: %d", strategy);
} }
PG_FREE_IF_COPY(query,1);
PG_RETURN_BOOL(res); PG_RETURN_BOOL(res);
} }