]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Simplify/clean up code for varlena types
authorTeodor Sigaev <teodor@sigaev.ru>
Tue, 1 Mar 2005 15:40:04 +0000 (15:40 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Tue, 1 Mar 2005 15:40:04 +0000 (15:40 +0000)
contrib/btree_gist/btree_bit.c
contrib/btree_gist/btree_bytea.c
contrib/btree_gist/btree_gist.sql.in
contrib/btree_gist/btree_numeric.c
contrib/btree_gist/btree_text.c
contrib/btree_gist/btree_utils_var.c

index 0b220ae2bb7fd333d9d332f49f5ce6bdd3f5c464..459c4d60b0df6676a15a9cb348657e47fa040931 100644 (file)
@@ -67,7 +67,7 @@ static bytea *
 gbt_bit_xfrm(bytea *leaf)
 {
        bytea      *out = leaf;
-       int                     s = VARBITBYTES(leaf) + VARHDRSZ;
+       int                     s = INTALIGN(VARBITBYTES(leaf) + VARHDRSZ);
 
        out = palloc(s);
        VARATT_SIZEP(out) = s;
@@ -126,8 +126,7 @@ Datum
 gbt_bit_consistent(PG_FUNCTION_ARGS)
 {
        GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-       GBT_VARKEY *ktst = (GBT_VARKEY *) DatumGetPointer(entry->key);
-       GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
+       GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
        void       *qtst = (void *) DatumGetPointer(PG_GETARG_DATUM(1));
        void       *query = (void *) DatumGetByteaP(PG_GETARG_DATUM(1));
        StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
@@ -144,8 +143,6 @@ gbt_bit_consistent(PG_FUNCTION_ARGS)
                pfree(q);
        }
 
-       if (ktst != key)
-               pfree(key);
        if (qtst != query)
                pfree(query);
        PG_RETURN_BOOL(retval);
index 3671acd24c8bd60f7a5ccf3e6c8610c35ffb52ed..2d2169412ee225ad287a5641f7b38c05a6f35fe0 100644 (file)
@@ -96,8 +96,7 @@ Datum
 gbt_bytea_consistent(PG_FUNCTION_ARGS)
 {
        GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-       GBT_VARKEY *ktst = (GBT_VARKEY *) DatumGetPointer(entry->key);
-       GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
+       GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
        void       *qtst = (void *) DatumGetPointer(PG_GETARG_DATUM(1));
        void       *query = (void *) DatumGetByteaP(PG_GETARG_DATUM(1));
        StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
@@ -106,8 +105,6 @@ gbt_bytea_consistent(PG_FUNCTION_ARGS)
 
        retval = gbt_var_consistent(&r, query, &strategy, GIST_LEAF(entry), &tinfo);
 
-       if (ktst != key)
-               pfree(key);
        if (qtst != query)
                pfree(query);
        PG_RETURN_BOOL(retval);
index 5dafe15960bd90ef9155dfcd817934173d9e63c2..a5f7ae3ffa0728bb09466e9c7f66bf6e6394641f 100644 (file)
@@ -107,6 +107,11 @@ RETURNS internal
 AS 'MODULE_PATHNAME'
 LANGUAGE 'C';
 
+CREATE FUNCTION gbt_var_decompress(internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE 'C';
+
 CREATE FUNCTION gbt_oid_penalty(internal,internal,internal)
 RETURNS internal
 AS 'MODULE_PATHNAME'
@@ -893,7 +898,7 @@ AS
        FUNCTION        1       gbt_text_consistent (internal, text, int2),
        FUNCTION        2       gbt_text_union (bytea, internal),
        FUNCTION        3       gbt_text_compress (internal),
-       FUNCTION        4       gbt_decompress (internal),
+       FUNCTION        4       gbt_var_decompress (internal),
        FUNCTION        5       gbt_text_penalty (internal, internal, internal),
        FUNCTION        6       gbt_text_picksplit (internal, internal),
        FUNCTION        7       gbt_text_same (internal, internal, internal),
@@ -912,7 +917,7 @@ AS
        FUNCTION        1       gbt_bpchar_consistent (internal, bpchar , int2),
        FUNCTION        2       gbt_text_union (bytea, internal),
        FUNCTION        3       gbt_bpchar_compress (internal),
-       FUNCTION        4       gbt_decompress (internal),
+       FUNCTION        4       gbt_var_decompress (internal),
        FUNCTION        5       gbt_text_penalty (internal, internal, internal),
        FUNCTION        6       gbt_text_picksplit (internal, internal),
        FUNCTION        7       gbt_text_same (internal, internal, internal),
@@ -969,7 +974,7 @@ AS
        FUNCTION        1       gbt_bytea_consistent (internal, bytea, int2),
        FUNCTION        2       gbt_bytea_union (bytea, internal),
        FUNCTION        3       gbt_bytea_compress (internal),
-       FUNCTION        4       gbt_decompress (internal),
+       FUNCTION        4       gbt_var_decompress (internal),
        FUNCTION        5       gbt_bytea_penalty (internal, internal, internal),
        FUNCTION        6       gbt_bytea_picksplit (internal, internal),
        FUNCTION        7       gbt_bytea_same (internal, internal, internal),
@@ -1026,7 +1031,7 @@ AS
        FUNCTION        1       gbt_numeric_consistent (internal, numeric, int2),
        FUNCTION        2       gbt_numeric_union (bytea, internal),
        FUNCTION        3       gbt_numeric_compress (internal),
-       FUNCTION        4       gbt_decompress (internal),
+       FUNCTION        4       gbt_var_decompress (internal),
        FUNCTION        5       gbt_numeric_penalty (internal, internal, internal),
        FUNCTION        6       gbt_numeric_picksplit (internal, internal),
        FUNCTION        7       gbt_numeric_same (internal, internal, internal),
@@ -1081,7 +1086,7 @@ AS
        FUNCTION        1       gbt_bit_consistent (internal, bit, int2),
        FUNCTION        2       gbt_bit_union (bytea, internal),
        FUNCTION        3       gbt_bit_compress (internal),
-       FUNCTION        4       gbt_decompress (internal),
+       FUNCTION        4       gbt_var_decompress (internal),
        FUNCTION        5       gbt_bit_penalty (internal, internal, internal),
        FUNCTION        6       gbt_bit_picksplit (internal, internal),
        FUNCTION        7       gbt_bit_same (internal, internal, internal),
@@ -1100,7 +1105,7 @@ AS
        FUNCTION        1       gbt_bit_consistent (internal, bit, int2),
        FUNCTION        2       gbt_bit_union (bytea, internal),
        FUNCTION        3       gbt_bit_compress (internal),
-       FUNCTION        4       gbt_decompress (internal),
+       FUNCTION        4       gbt_var_decompress (internal),
        FUNCTION        5       gbt_bit_penalty (internal, internal, internal),
        FUNCTION        6       gbt_bit_picksplit (internal, internal),
        FUNCTION        7       gbt_bit_same (internal, internal, internal),
index 8b54b931d5b81456367a88911a8d7bbf18999d7d..6818c5c0e304c2ab21eeb951fe3bdd2d751a064f 100644 (file)
@@ -97,8 +97,7 @@ gbt_numeric_consistent(PG_FUNCTION_ARGS)
 {
 
        GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-       GBT_VARKEY *ktst = (GBT_VARKEY *) DatumGetPointer(entry->key);
-       GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
+       GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
        void       *qtst = (void *) DatumGetPointer(PG_GETARG_DATUM(1));
        void       *query = (void *) DatumGetNumeric(PG_GETARG_DATUM(1));
        StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
@@ -107,8 +106,6 @@ gbt_numeric_consistent(PG_FUNCTION_ARGS)
 
        retval = gbt_var_consistent(&r, query, &strategy, GIST_LEAF(entry), &tinfo);
 
-       if (ktst != key)
-               pfree(key);
        if (qtst != query)
                pfree(query);
        PG_RETURN_BOOL(retval);
index d2603e1d9110fc0e836b07862090365937aef2cc..8124362a882688ffbbd8cef401ac2ecad89024fd 100644 (file)
@@ -59,64 +59,9 @@ gbt_textlt(const void *a, const void *b)
 static int32
 gbt_textcmp(const bytea *a, const bytea *b)
 {
-       return strcmp(VARDATA(a), VARDATA(b));
+       return DatumGetInt32(DirectFunctionCall2(bttextcmp, PointerGetDatum(a), PointerGetDatum(b)));
 }
 
-
-/*
- * Converts data of leaf using strxfrm ( locale support )
-*/
-
-static bytea *
-gbt_text_xfrm(bytea *leaf)
-{
-       bytea      *out = leaf;
-       int32           ilen = VARSIZE(leaf) - VARHDRSZ;
-       int32           olen;
-       char       *sin;
-       char       *sou;
-
-       sin = palloc(ilen + 1);
-       memcpy(sin, (void *) VARDATA(leaf), ilen);
-       sin[ilen] = '\0';
-
-       olen = strxfrm(NULL, &sin[0], 0) + 1;
-       sou = palloc(olen);
-       olen = strxfrm(sou, &sin[0], olen);
-       olen += VARHDRSZ;
-       out = palloc(olen + 1);
-       out->vl_len = olen + 1;
-       memcpy((void *) VARDATA(out), sou, olen - VARHDRSZ);
-       ((char *) out)[olen] = '\0';
-
-       pfree(sou);
-       pfree(sin);
-
-       return out;
-}
-
-
-static GBT_VARKEY *
-gbt_text_l2n(GBT_VARKEY * leaf)
-{
-
-       GBT_VARKEY *out = leaf;
-       GBT_VARKEY_R r = gbt_var_key_readable(leaf);
-       bytea      *o;
-
-       o = gbt_text_xfrm(r.lower);
-       r.lower = r.upper = o;
-       out = gbt_var_key_copy(&r, TRUE);
-       pfree(o);
-
-       return out;
-
-}
-
-
-
-
-
 static const gbtree_vinfo tinfo =
 {
        gbt_t_text,
@@ -128,7 +73,7 @@ static const gbtree_vinfo tinfo =
        gbt_textle,
        gbt_textlt,
        gbt_textcmp,
-       gbt_text_l2n
+       NULL
 };
 
 
@@ -157,14 +102,13 @@ gbt_bpchar_compress(PG_FUNCTION_ARGS)
        {
 
                Datum           d = DirectFunctionCall1(rtrim1, entry->key);
-               GISTENTRY  *trim = palloc(sizeof(GISTENTRY));
+               GISTENTRY       trim;
 
-               gistentryinit(*trim, d,
+               gistentryinit(trim, d,
                                          entry->rel, entry->page,
                                          entry->offset, VARSIZE(DatumGetPointer(d)), TRUE);
-               retval = gbt_var_compress(trim, &tinfo);
+               retval = gbt_var_compress(&trim, &tinfo);
 
-               pfree(trim);
                pfree(DatumGetPointer(d));
        }
        else
@@ -179,27 +123,15 @@ Datum
 gbt_text_consistent(PG_FUNCTION_ARGS)
 {
        GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-       GBT_VARKEY *ktst = (GBT_VARKEY *) DatumGetPointer(entry->key);
-       GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
+       GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
        void       *qtst = (void *) DatumGetPointer(PG_GETARG_DATUM(1));
        void       *query = (void *) DatumGetTextP(PG_GETARG_DATUM(1));
        StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
        bool            retval = FALSE;
        GBT_VARKEY_R r = gbt_var_key_readable(key);
 
-       if (GIST_LEAF(entry))
-               retval = gbt_var_consistent(&r, query, &strategy, TRUE, &tinfo);
-       else
-       {
-               bytea      *q = gbt_text_xfrm((bytea *) query);
+       retval = gbt_var_consistent(&r, query, &strategy, GIST_LEAF(entry), &tinfo);
 
-               retval = gbt_var_consistent(&r, (void *) q, &strategy, FALSE, &tinfo);
-               if (q != query)
-                       pfree(q);
-       }
-
-       if (ktst != key)
-               pfree(key);
        if (qtst != query)
                pfree(query);
 
@@ -211,8 +143,7 @@ Datum
 gbt_bpchar_consistent(PG_FUNCTION_ARGS)
 {
        GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-       GBT_VARKEY *ktst = (GBT_VARKEY *) DatumGetPointer(entry->key);
-       GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
+       GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
        void       *qtst = (void *) DatumGetPointer(PG_GETARG_DATUM(1));
        void       *query = (void *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1)));
        void       *trim = (void *) DatumGetPointer(DirectFunctionCall1(rtrim1, PointerGetDatum(query)));
@@ -220,21 +151,10 @@ gbt_bpchar_consistent(PG_FUNCTION_ARGS)
        bool            retval = FALSE;
        GBT_VARKEY_R r = gbt_var_key_readable(key);
 
-       if (GIST_LEAF(entry))
-               retval = gbt_var_consistent(&r, trim, &strategy, TRUE, &tinfo);
-       else
-       {
-               bytea      *q = gbt_text_xfrm((bytea *) trim);
-
-               retval = gbt_var_consistent(&r, (void *) q, &strategy, FALSE, &tinfo);
-               if (q != trim)
-                       pfree(q);
-       }
+       retval = gbt_var_consistent(&r, trim, &strategy, GIST_LEAF(entry), &tinfo);
 
        pfree(trim);
 
-       if (ktst != key)
-               pfree(key);
        if (qtst != query)
                pfree(query);
        PG_RETURN_BOOL(retval);
index f5198392c40556aad4a1edd7e2ae42b0d9fb332b..d7686526a28ec74802255678c9ac10e612389064 100644 (file)
@@ -2,6 +2,30 @@
 #include "utils/pg_locale.h"
 #include "btree_utils_var.h"
 
+PG_FUNCTION_INFO_V1(gbt_var_decompress);
+Datum           gbt_var_decompress(PG_FUNCTION_ARGS);
+
+
+Datum
+gbt_var_decompress(PG_FUNCTION_ARGS)
+{
+        GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
+        GBT_VARKEY   *key = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
+
+        if (key != (GBT_VARKEY *) DatumGetPointer(entry->key))
+        {
+                GISTENTRY  *retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
+
+                gistentryinit(*retval, PointerGetDatum(key),
+                                          entry->rel, entry->page,
+                                          entry->offset, VARSIZE(key), FALSE);
+
+                PG_RETURN_POINTER(retval);
+        }
+
+        PG_RETURN_POINTER(entry);
+}
+
 /* Returns a better readable representaion of variable key ( sets pointer ) */
 
 extern         GBT_VARKEY_R
@@ -265,12 +289,8 @@ gbt_var_compress(GISTENTRY *entry, const gbtree_vinfo * tinfo)
                                          entry->offset, VARSIZE(r), TRUE);
        }
        else
-       {
                retval = entry;
 
-
-       }
-
        return (retval);
 }
 
@@ -282,27 +302,20 @@ gbt_var_union(const GistEntryVector *entryvec, int32 *size, const gbtree_vinfo *
 
        int                     i = 0,
                                numranges = entryvec->n;
-       GBT_VARKEY *cur,
-                          *tst = NULL;
+       GBT_VARKEY *cur;
        Datum           out;
        GBT_VARKEY_R rk;
 
        *size = sizeof(GBT_VARKEY);
 
-       tst = (GBT_VARKEY *) DatumGetPointer((entryvec->vector[0].key));
-       cur = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM((entryvec->vector[0].key)));
+       cur = (GBT_VARKEY *) DatumGetPointer(entryvec->vector[0].key);
        rk = gbt_var_key_readable(cur);
        out = PointerGetDatum(gbt_var_key_copy(&rk, TRUE));
-       if (tst != cur)
-               pfree(cur);
 
        for (i = 1; i < numranges; i++)
        {
-               tst = (GBT_VARKEY *) DatumGetPointer((entryvec->vector[i].key));
-               cur = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM((entryvec->vector[i].key)));
+               cur = (GBT_VARKEY *) DatumGetPointer(entryvec->vector[i].key);
                gbt_var_bin_union(&out, cur, tinfo);
-               if (tst != cur)
-                       pfree(cur);
        }
 
 
@@ -328,10 +341,8 @@ extern bool
 gbt_var_same(bool *result, const Datum d1, const Datum d2, const gbtree_vinfo * tinfo)
 {
 
-       GBT_VARKEY *tst1 = (GBT_VARKEY *) DatumGetPointer(d1);
-       GBT_VARKEY *t1 = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(d1));
-       GBT_VARKEY *tst2 = (GBT_VARKEY *) DatumGetPointer(d2);
-       GBT_VARKEY *t2 = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(d2));
+       GBT_VARKEY *t1 = (GBT_VARKEY *) DatumGetPointer(d1);
+       GBT_VARKEY *t2 = (GBT_VARKEY *) DatumGetPointer(d2);
        GBT_VARKEY_R r1,
                                r2;
 
@@ -346,11 +357,6 @@ gbt_var_same(bool *result, const Datum d1, const Datum d2, const gbtree_vinfo *
        else
                *result = (t1 == NULL && t2 == NULL) ? TRUE : FALSE;
 
-       if (tst1 != t1)
-               pfree(t1);
-       if (tst2 != t2)
-               pfree(t2);
-
        PG_RETURN_POINTER(result);
 }
 
@@ -360,10 +366,8 @@ extern float *
 gbt_var_penalty(float *res, const GISTENTRY *o, const GISTENTRY *n, const gbtree_vinfo * tinfo)
 {
 
-       GBT_VARKEY *orgt = (GBT_VARKEY *) DatumGetPointer(o->key);
-       GBT_VARKEY *orge = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(o->key));
-       GBT_VARKEY *newt = (GBT_VARKEY *) DatumGetPointer(n->key);
-       GBT_VARKEY *newe = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(n->key));
+       GBT_VARKEY *orge = (GBT_VARKEY *) DatumGetPointer(o->key);
+       GBT_VARKEY *newe = (GBT_VARKEY *) DatumGetPointer(n->key);
        GBT_VARKEY_R ok,
                                nk;
        GBT_VARKEY *tmp = NULL;
@@ -436,13 +440,7 @@ gbt_var_penalty(float *res, const GISTENTRY *o, const GISTENTRY *n, const gbtree
        if (tmp && tmp != newe)
                pfree(tmp);
 
-       if (newe != newt)
-               pfree(newe);
-
-       if (orge != orgt)
-               pfree(orge);
        return res;
-
 }
 
 
@@ -466,12 +464,9 @@ gbt_var_picksplit(const GistEntryVector *entryvec, GIST_SPLITVEC *v, const gbtre
        OffsetNumber i,
                                maxoff = entryvec->n - 1;
        Vsrt       *arr;
-       int                     pfrcntr = 0,
-                               svcntr = 0,
+       int                     svcntr = 0,
                                nbytes;
-       char       *tst,
-                          *cur;
-       char      **pfr = NULL;
+       char       *cur;
        GBT_VARKEY **sv = NULL;
 
        arr = (Vsrt *) palloc((maxoff + 1) * sizeof(Vsrt));
@@ -483,7 +478,6 @@ gbt_var_picksplit(const GistEntryVector *entryvec, GIST_SPLITVEC *v, const gbtre
        v->spl_nleft = 0;
        v->spl_nright = 0;
 
-       pfr = palloc(sizeof(GBT_VARKEY *) * (maxoff + 1));
        sv = palloc(sizeof(bytea *) * (maxoff + 1));
 
        /* Sort entries */
@@ -492,13 +486,7 @@ gbt_var_picksplit(const GistEntryVector *entryvec, GIST_SPLITVEC *v, const gbtre
        {
                GBT_VARKEY_R ro;
 
-               tst = (char *) DatumGetPointer((entryvec->vector[i].key));
-               cur = (char *) DatumGetPointer(PG_DETOAST_DATUM((entryvec->vector[i].key)));
-               if (tst != cur)
-               {
-                       pfr[pfrcntr] = cur;
-                       pfrcntr++;
-               }
+               cur = (char *) DatumGetPointer(entryvec->vector[i].key);
                ro = gbt_var_key_readable((GBT_VARKEY *) cur);
                if (ro.lower == ro.upper)               /* leaf */
                {
@@ -537,17 +525,10 @@ gbt_var_picksplit(const GistEntryVector *entryvec, GIST_SPLITVEC *v, const gbtre
                }
        }
 
-       /* Free detoasted keys */
-       for (i = 0; i < pfrcntr; i++)
-               pfree(pfr[i]);
-
        /* Free strxfrm'ed leafs */
        for (i = 0; i < svcntr; i++)
                pfree(sv[i]);
 
-       if (pfr)
-               pfree(pfr);
-
        if (sv)
                pfree(sv);