diff --git a/contrib/btree_gist/btree_utils_var.c b/contrib/btree_gist/btree_utils_var.c index 691b10388eda6ebcd89ba84437fa5b170909258f..d7387e63d6d4136dfe44fff6a5a4a3ffa3ff6a50 100644 --- a/contrib/btree_gist/btree_utils_var.c +++ b/contrib/btree_gist/btree_utils_var.c @@ -108,14 +108,12 @@ gbt_var_leaf2node(GBT_VARKEY *leaf, const gbtree_vinfo *tinfo) static int32 gbt_var_node_cp_len(const GBT_VARKEY *node, const gbtree_vinfo *tinfo) { - GBT_VARKEY_R r = gbt_var_key_readable(node); int32 i = 0; int32 l = 0; int32 t1len = VARSIZE(r.lower) - VARHDRSZ; int32 t2len = VARSIZE(r.upper) - VARHDRSZ; int32 ml = Min(t1len, t2len); - char *p1 = VARDATA(r.lower); char *p2 = VARDATA(r.upper); @@ -126,7 +124,6 @@ gbt_var_node_cp_len(const GBT_VARKEY *node, const gbtree_vinfo *tinfo) { if (tinfo->eml > 1 && l == 0) { - if ((l = pg_mblen(p1)) != pg_mblen(p2)) { return i; @@ -369,13 +366,14 @@ gbt_var_penalty(float *res, const GISTENTRY *o, const GISTENTRY *n, GBT_VARKEY *newe = (GBT_VARKEY *) DatumGetPointer(n->key); GBT_VARKEY_R ok, nk; - GBT_VARKEY *tmp = NULL; *res = 0.0; nk = gbt_var_key_readable(newe); if (nk.lower == nk.upper) /* leaf */ { + GBT_VARKEY *tmp; + tmp = gbt_var_leaf2node(newe, tinfo); if (tmp != newe) nk = gbt_var_key_readable(tmp); @@ -390,7 +388,7 @@ gbt_var_penalty(float *res, const GISTENTRY *o, const GISTENTRY *n, gbt_bytea_pf_match(ok.upper, nk.upper, tinfo)))) { Datum d = PointerGetDatum(0); - double dres = 0.0; + double dres; int32 ol, ul; @@ -401,20 +399,18 @@ gbt_var_penalty(float *res, const GISTENTRY *o, const GISTENTRY *n, if (ul < ol) { - dres = (ol - ul); /* lost of common prefix len */ + dres = (ol - ul); /* reduction of common prefix len */ } else { GBT_VARKEY_R uk = gbt_var_key_readable((GBT_VARKEY *) DatumGetPointer(d)); + unsigned char tmp[4]; - char tmp[4]; - - tmp[0] = ((VARSIZE(ok.lower) - VARHDRSZ) == ul) ? (CHAR_MIN) : (VARDATA(ok.lower)[ul]); - tmp[1] = ((VARSIZE(uk.lower) - VARHDRSZ) == ul) ? (CHAR_MIN) : (VARDATA(uk.lower)[ul]); - tmp[2] = ((VARSIZE(ok.upper) - VARHDRSZ) == ul) ? (CHAR_MIN) : (VARDATA(ok.upper)[ul]); - tmp[3] = ((VARSIZE(uk.upper) - VARHDRSZ) == ul) ? (CHAR_MIN) : (VARDATA(uk.upper)[ul]); - dres = (tmp[0] - tmp[1]) + - (tmp[3] - tmp[2]); + tmp[0] = (unsigned char) (((VARSIZE(ok.lower) - VARHDRSZ) <= ul) ? 0 : (VARDATA(ok.lower)[ul])); + tmp[1] = (unsigned char) (((VARSIZE(uk.lower) - VARHDRSZ) <= ul) ? 0 : (VARDATA(uk.lower)[ul])); + tmp[2] = (unsigned char) (((VARSIZE(ok.upper) - VARHDRSZ) <= ul) ? 0 : (VARDATA(ok.upper)[ul])); + tmp[3] = (unsigned char) (((VARSIZE(uk.upper) - VARHDRSZ) <= ul) ? 0 : (VARDATA(uk.upper)[ul])); + dres = Abs(tmp[0] - tmp[1]) + Abs(tmp[3] - tmp[2]); dres /= 256.0; }