From: Heikki Linnakangas Date: Thu, 26 Mar 2015 21:10:10 +0000 (+0200) Subject: Minor refactoring of btree_gist code. X-Git-Tag: REL9_5_ALPHA1~545 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=8816af65e4f8285d3ef73158b09490099921f870;p=postgresql.git Minor refactoring of btree_gist code. The gbt_var_key_copy function was doing two different things depending on the boolean argument. Seems cleaner to have two separate functions. Remove unused argument from gbt_num_compress. --- diff --git a/contrib/btree_gist/btree_bit.c b/contrib/btree_gist/btree_bit.c index 76297515c5e..af210439f06 100644 --- a/contrib/btree_gist/btree_bit.c +++ b/contrib/btree_gist/btree_bit.c @@ -99,7 +99,7 @@ gbt_bit_l2n(GBT_VARKEY *leaf) o = gbt_bit_xfrm(r.lower); r.upper = r.lower = o; - out = gbt_var_key_copy(&r, TRUE); + out = gbt_var_key_copy(&r); pfree(o); return out; diff --git a/contrib/btree_gist/btree_cash.c b/contrib/btree_gist/btree_cash.c index 63f86ebeefe..d9b53d5e34e 100644 --- a/contrib/btree_gist/btree_cash.c +++ b/contrib/btree_gist/btree_cash.c @@ -119,9 +119,8 @@ Datum gbt_cash_compress(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - GISTENTRY *retval = NULL; - PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo)); + PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo)); } diff --git a/contrib/btree_gist/btree_date.c b/contrib/btree_gist/btree_date.c index 7a4c6aa6003..153e0eb9b6f 100644 --- a/contrib/btree_gist/btree_date.c +++ b/contrib/btree_gist/btree_date.c @@ -130,9 +130,8 @@ Datum gbt_date_compress(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - GISTENTRY *retval = NULL; - PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo)); + PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo)); } diff --git a/contrib/btree_gist/btree_float4.c b/contrib/btree_gist/btree_float4.c index 778d8dad844..6a1db380eaf 100644 --- a/contrib/btree_gist/btree_float4.c +++ b/contrib/btree_gist/btree_float4.c @@ -112,9 +112,8 @@ Datum gbt_float4_compress(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - GISTENTRY *retval = NULL; - PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo)); + PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo)); } diff --git a/contrib/btree_gist/btree_float8.c b/contrib/btree_gist/btree_float8.c index c898bf2d975..3b6661038a1 100644 --- a/contrib/btree_gist/btree_float8.c +++ b/contrib/btree_gist/btree_float8.c @@ -119,9 +119,8 @@ Datum gbt_float8_compress(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - GISTENTRY *retval = NULL; - PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo)); + PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo)); } diff --git a/contrib/btree_gist/btree_int2.c b/contrib/btree_gist/btree_int2.c index a88aae64537..8db533c6e58 100644 --- a/contrib/btree_gist/btree_int2.c +++ b/contrib/btree_gist/btree_int2.c @@ -119,9 +119,8 @@ Datum gbt_int2_compress(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - GISTENTRY *retval = NULL; - PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo)); + PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo)); } diff --git a/contrib/btree_gist/btree_int4.c b/contrib/btree_gist/btree_int4.c index 889a5120783..221301c001d 100644 --- a/contrib/btree_gist/btree_int4.c +++ b/contrib/btree_gist/btree_int4.c @@ -120,9 +120,8 @@ Datum gbt_int4_compress(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - GISTENTRY *retval = NULL; - PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo)); + PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo)); } diff --git a/contrib/btree_gist/btree_int8.c b/contrib/btree_gist/btree_int8.c index 8685cee1760..9fade3c6d87 100644 --- a/contrib/btree_gist/btree_int8.c +++ b/contrib/btree_gist/btree_int8.c @@ -120,9 +120,8 @@ Datum gbt_int8_compress(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - GISTENTRY *retval = NULL; - PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo)); + PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo)); } diff --git a/contrib/btree_gist/btree_macaddr.c b/contrib/btree_gist/btree_macaddr.c index ed58a1b7429..69d7a72afb3 100644 --- a/contrib/btree_gist/btree_macaddr.c +++ b/contrib/btree_gist/btree_macaddr.c @@ -110,9 +110,8 @@ Datum gbt_macad_compress(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - GISTENTRY *retval = NULL; - PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo)); + PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo)); } diff --git a/contrib/btree_gist/btree_numeric.c b/contrib/btree_gist/btree_numeric.c index 02ccca86471..47b00209c8d 100644 --- a/contrib/btree_gist/btree_numeric.c +++ b/contrib/btree_gist/btree_numeric.c @@ -170,7 +170,7 @@ gbt_numeric_penalty(PG_FUNCTION_ARGS) uk; rk = gbt_var_key_readable(org); - uni = PointerGetDatum(gbt_var_key_copy(&rk, TRUE)); + uni = PointerGetDatum(gbt_var_key_copy(&rk)); gbt_var_bin_union(&uni, newe, PG_GET_COLLATION(), &tinfo); ok = gbt_var_key_readable(org); uk = gbt_var_key_readable((GBT_VARKEY *) DatumGetPointer(uni)); diff --git a/contrib/btree_gist/btree_oid.c b/contrib/btree_gist/btree_oid.c index f6b7bfa05b7..751b35df8ee 100644 --- a/contrib/btree_gist/btree_oid.c +++ b/contrib/btree_gist/btree_oid.c @@ -120,9 +120,8 @@ Datum gbt_oid_compress(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - GISTENTRY *retval = NULL; - PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo)); + PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo)); } diff --git a/contrib/btree_gist/btree_time.c b/contrib/btree_gist/btree_time.c index cdf81711e76..a620e4a23c0 100644 --- a/contrib/btree_gist/btree_time.c +++ b/contrib/btree_gist/btree_time.c @@ -157,9 +157,8 @@ Datum gbt_time_compress(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - GISTENTRY *retval = NULL; - PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo)); + PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo)); } diff --git a/contrib/btree_gist/btree_ts.c b/contrib/btree_gist/btree_ts.c index d472d494c9c..80bbe34ff65 100644 --- a/contrib/btree_gist/btree_ts.c +++ b/contrib/btree_gist/btree_ts.c @@ -212,9 +212,8 @@ Datum gbt_ts_compress(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - GISTENTRY *retval = NULL; - PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo)); + PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo)); } diff --git a/contrib/btree_gist/btree_utils_num.c b/contrib/btree_gist/btree_utils_num.c index 7adf3aac48e..86a7f486f9f 100644 --- a/contrib/btree_gist/btree_utils_num.c +++ b/contrib/btree_gist/btree_utils_num.c @@ -11,8 +11,10 @@ GISTENTRY * -gbt_num_compress(GISTENTRY *retval, GISTENTRY *entry, const gbtree_ninfo *tinfo) +gbt_num_compress(GISTENTRY *entry, const gbtree_ninfo *tinfo) { + GISTENTRY *retval; + if (entry->leafkey) { union diff --git a/contrib/btree_gist/btree_utils_num.h b/contrib/btree_gist/btree_utils_num.h index 0d79cd2a7f7..05a313a1314 100644 --- a/contrib/btree_gist/btree_utils_num.h +++ b/contrib/btree_gist/btree_utils_num.h @@ -128,8 +128,7 @@ extern float8 gbt_num_distance(const GBT_NUMKEY_R *key, const void *query, extern GIST_SPLITVEC *gbt_num_picksplit(const GistEntryVector *entryvec, GIST_SPLITVEC *v, const gbtree_ninfo *tinfo); -extern GISTENTRY *gbt_num_compress(GISTENTRY *retval, GISTENTRY *entry, - const gbtree_ninfo *tinfo); +extern GISTENTRY *gbt_num_compress(GISTENTRY *entry, const gbtree_ninfo *tinfo); extern void *gbt_num_union(GBT_NUMKEY *out, const GistEntryVector *entryvec, diff --git a/contrib/btree_gist/btree_utils_var.c b/contrib/btree_gist/btree_utils_var.c index 6ad33478d09..e664211198e 100644 --- a/contrib/btree_gist/btree_utils_var.c +++ b/contrib/btree_gist/btree_utils_var.c @@ -66,26 +66,37 @@ gbt_var_key_readable(const GBT_VARKEY *k) } +/* + * Create a leaf-entry to store in the index, from a single Datum. + */ +static GBT_VARKEY * +gbt_var_key_from_datum(const struct varlena *u) +{ + int32 lowersize = VARSIZE(u); + GBT_VARKEY *r; + + r = (GBT_VARKEY *) palloc(lowersize + VARHDRSZ); + memcpy(VARDATA(r), u, lowersize); + SET_VARSIZE(r, lowersize + VARHDRSZ); + + return r; +} + +/* + * Create an entry to store in the index, from lower and upper bound. + */ GBT_VARKEY * -gbt_var_key_copy(const GBT_VARKEY_R *u, bool force_node) +gbt_var_key_copy(const GBT_VARKEY_R *u) { - GBT_VARKEY *r = NULL; int32 lowersize = VARSIZE(u->lower); int32 uppersize = VARSIZE(u->upper); + GBT_VARKEY *r; + + r = (GBT_VARKEY *) palloc0(INTALIGN(lowersize) + uppersize + VARHDRSZ); + memcpy(VARDATA(r), u->lower, lowersize); + memcpy(VARDATA(r) + INTALIGN(lowersize), u->upper, uppersize); + SET_VARSIZE(r, INTALIGN(lowersize) + uppersize + VARHDRSZ); - if (u->lower == u->upper && !force_node) - { /* leaf key mode */ - r = (GBT_VARKEY *) palloc(lowersize + VARHDRSZ); - memcpy(VARDATA(r), u->lower, lowersize); - SET_VARSIZE(r, lowersize + VARHDRSZ); - } - else - { /* node key mode */ - r = (GBT_VARKEY *) palloc0(INTALIGN(lowersize) + uppersize + VARHDRSZ); - memcpy(VARDATA(r), u->lower, lowersize); - memcpy(VARDATA(r) + INTALIGN(lowersize), u->upper, uppersize); - SET_VARSIZE(r, INTALIGN(lowersize) + uppersize + VARHDRSZ); - } return r; } @@ -255,18 +266,17 @@ gbt_var_bin_union(Datum *u, GBT_VARKEY *e, Oid collation, } if (update) - *u = PointerGetDatum(gbt_var_key_copy(&nr, TRUE)); + *u = PointerGetDatum(gbt_var_key_copy(&nr)); } else { nr.lower = eo.lower; nr.upper = eo.upper; - *u = PointerGetDatum(gbt_var_key_copy(&nr, TRUE)); + *u = PointerGetDatum(gbt_var_key_copy(&nr)); } } - GISTENTRY * gbt_var_compress(GISTENTRY *entry, const gbtree_vinfo *tinfo) { @@ -274,12 +284,10 @@ gbt_var_compress(GISTENTRY *entry, const gbtree_vinfo *tinfo) if (entry->leafkey) { - GBT_VARKEY *r = NULL; - bytea *leaf = (bytea *) DatumGetPointer(PG_DETOAST_DATUM(entry->key)); - GBT_VARKEY_R u; + struct varlena *leaf = PG_DETOAST_DATUM(entry->key); + GBT_VARKEY *r; - u.lower = u.upper = leaf; - r = gbt_var_key_copy(&u, FALSE); + r = gbt_var_key_from_datum(leaf); retval = palloc(sizeof(GISTENTRY)); gistentryinit(*retval, PointerGetDatum(r), @@ -293,7 +301,6 @@ gbt_var_compress(GISTENTRY *entry, const gbtree_vinfo *tinfo) } - GBT_VARKEY * gbt_var_union(const GistEntryVector *entryvec, int32 *size, Oid collation, const gbtree_vinfo *tinfo) @@ -308,7 +315,7 @@ gbt_var_union(const GistEntryVector *entryvec, int32 *size, Oid collation, cur = (GBT_VARKEY *) DatumGetPointer(entryvec->vector[0].key); rk = gbt_var_key_readable(cur); - out = PointerGetDatum(gbt_var_key_copy(&rk, TRUE)); + out = PointerGetDatum(gbt_var_key_copy(&rk)); for (i = 1; i < numranges; i++) { diff --git a/contrib/btree_gist/btree_utils_var.h b/contrib/btree_gist/btree_utils_var.h index 7a3eeec01a0..9a7c4d10554 100644 --- a/contrib/btree_gist/btree_utils_var.h +++ b/contrib/btree_gist/btree_utils_var.h @@ -47,7 +47,7 @@ typedef struct extern GBT_VARKEY_R gbt_var_key_readable(const GBT_VARKEY *k); -extern GBT_VARKEY *gbt_var_key_copy(const GBT_VARKEY_R *u, bool force_node); +extern GBT_VARKEY *gbt_var_key_copy(const GBT_VARKEY_R *u); extern GISTENTRY *gbt_var_compress(GISTENTRY *entry, const gbtree_vinfo *tinfo);