diff options
Diffstat (limited to 'contrib/ltree/ltree_gist.c')
-rw-r--r-- | contrib/ltree/ltree_gist.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c index 7e7ede02853..fab92f8e338 100644 --- a/contrib/ltree/ltree_gist.c +++ b/contrib/ltree/ltree_gist.c @@ -622,7 +622,7 @@ Datum ltree_consistent(PG_FUNCTION_ARGS) { 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); StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); bool res = false; @@ -634,15 +634,18 @@ ltree_consistent(PG_FUNCTION_ARGS) switch (strategy) { case BTLessStrategyNumber: + query = PG_GETARG_LTREE(1); res = (GIST_LEAF(entry)) ? (ltree_compare((ltree *) query, LTG_NODE(key)) > 0) : (ltree_compare((ltree *) query, LTG_GETLNODE(key)) >= 0); break; case BTLessEqualStrategyNumber: + query = PG_GETARG_LTREE(1); res = (ltree_compare((ltree *) query, LTG_GETLNODE(key)) >= 0); break; case BTEqualStrategyNumber: + query = PG_GETARG_LTREE(1); if (GIST_LEAF(entry)) res = (ltree_compare((ltree *) query, LTG_NODE(key)) == 0); else @@ -653,21 +656,25 @@ ltree_consistent(PG_FUNCTION_ARGS) ); break; case BTGreaterEqualStrategyNumber: + query = PG_GETARG_LTREE(1); res = (ltree_compare((ltree *) query, LTG_GETRNODE(key)) <= 0); break; case BTGreaterStrategyNumber: + query = PG_GETARG_LTREE(1); res = (GIST_LEAF(entry)) ? (ltree_compare((ltree *) query, LTG_GETRNODE(key)) < 0) : (ltree_compare((ltree *) query, LTG_GETRNODE(key)) <= 0); break; case 10: + query = PG_GETARG_LTREE_COPY(1); res = (GIST_LEAF(entry)) ? inner_isparent((ltree *) query, LTG_NODE(key)) : gist_isparent(key, (ltree *) query); break; case 11: + query = PG_GETARG_LTREE_COPY(1); res = (GIST_LEAF(entry)) ? inner_isparent(LTG_NODE(key), (ltree *) query) : @@ -675,6 +682,7 @@ ltree_consistent(PG_FUNCTION_ARGS) break; case 12: case 13: + query = PG_GETARG_LQUERY(1); if (GIST_LEAF(entry)) res = DatumGetBool(DirectFunctionCall2(ltq_regex, PointerGetDatum(LTG_NODE(key)), @@ -685,6 +693,7 @@ ltree_consistent(PG_FUNCTION_ARGS) break; case 14: case 15: + query = PG_GETARG_LQUERY(1); if (GIST_LEAF(entry)) res = DatumGetBool(DirectFunctionCall2(ltxtq_exec, PointerGetDatum(LTG_NODE(key)), @@ -695,6 +704,7 @@ ltree_consistent(PG_FUNCTION_ARGS) break; case 16: case 17: + query = DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1))); if (GIST_LEAF(entry)) res = DatumGetBool(DirectFunctionCall2(lt_q_regex, PointerGetDatum(LTG_NODE(key)), @@ -707,5 +717,7 @@ ltree_consistent(PG_FUNCTION_ARGS) /* internal error */ elog(ERROR, "unrecognized StrategyNumber: %d", strategy); } + + PG_FREE_IF_COPY(query,1); PG_RETURN_BOOL(res); } |