]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix bug corrupting query in gist consistent function.
authorTeodor Sigaev <teodor@sigaev.ru>
Tue, 11 Jul 2006 16:02:50 +0000 (16:02 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Tue, 11 Jul 2006 16:02:50 +0000 (16:02 +0000)
Thank to Mario Weilguni <mweilguni@sime.com> to discover a bug.

contrib/ltree/_ltree_gist.c
contrib/ltree/ltree.h
contrib/ltree/ltree_gist.c

index f014b62a2120c11be11af4f7de25d1e5541b52b8..602ed8ac49b7c82e2bbc11f01749a911835608e1 100644 (file)
@@ -577,5 +577,6 @@ _ltree_consistent(PG_FUNCTION_ARGS)
                        /* internal error */
                        elog(ERROR, "unrecognized StrategyNumber: %d", strategy);
        }
+       PG_FREE_IF_COPY(query,1);
        PG_RETURN_BOOL(res);
 }
index 8f9ba4074ffa212452dbfed42e778f92454e2ddf..c4c89ee3e47fbc9d524a82e907a468708e8d13dc 100644 (file)
@@ -161,8 +161,11 @@ bool compare_subnode(ltree_level * t, char *q, 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_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_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_COPY(x) ((ltxtquery*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(x))))
 
 /* GiST support for ltree */
 
index 7e7ede02853d771915a9babd66c03484cfa81ca7..fab92f8e3387a80e13ef2f7bac687b04db71d2e2 100644 (file)
@@ -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);
 }