aboutsummaryrefslogtreecommitdiff
path: root/contrib/btree_gist/btree_text.c
diff options
context:
space:
mode:
authorTeodor Sigaev <teodor@sigaev.ru>2005-03-01 15:40:04 +0000
committerTeodor Sigaev <teodor@sigaev.ru>2005-03-01 15:40:04 +0000
commite1662cb6b8d398bffe2f9a72df0c6103dadc4be2 (patch)
treeb6699a20fbd3ba2712d0a838f517a64e273a1e85 /contrib/btree_gist/btree_text.c
parent03b8efa5403ccece65e21496ebde167feeca4f26 (diff)
downloadpostgresql-e1662cb6b8d398bffe2f9a72df0c6103dadc4be2.tar.gz
postgresql-e1662cb6b8d398bffe2f9a72df0c6103dadc4be2.zip
Simplify/clean up code for varlena types
Diffstat (limited to 'contrib/btree_gist/btree_text.c')
-rw-r--r--contrib/btree_gist/btree_text.c98
1 files changed, 9 insertions, 89 deletions
diff --git a/contrib/btree_gist/btree_text.c b/contrib/btree_gist/btree_text.c
index d2603e1d911..8124362a882 100644
--- a/contrib/btree_gist/btree_text.c
+++ b/contrib/btree_gist/btree_text.c
@@ -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);