diff options
author | Teodor Sigaev <teodor@sigaev.ru> | 2005-03-01 15:40:04 +0000 |
---|---|---|
committer | Teodor Sigaev <teodor@sigaev.ru> | 2005-03-01 15:40:04 +0000 |
commit | e1662cb6b8d398bffe2f9a72df0c6103dadc4be2 (patch) | |
tree | b6699a20fbd3ba2712d0a838f517a64e273a1e85 /contrib/btree_gist/btree_text.c | |
parent | 03b8efa5403ccece65e21496ebde167feeca4f26 (diff) | |
download | postgresql-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.c | 98 |
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); |