]> granicus.if.org Git - postgresql/blobdiff - contrib/btree_gist/btree_utils_var.c
Fix erroneous range-union logic for varlena types in contrib/btree_gist.
[postgresql] / contrib / btree_gist / btree_utils_var.c
index 9f8a132775beda7a9cb4ac81be297a4064d27d73..691b10388eda6ebcd89ba84437fa5b170909258f 100644 (file)
@@ -225,13 +225,13 @@ void
 gbt_var_bin_union(Datum *u, GBT_VARKEY *e, Oid collation,
                                  const gbtree_vinfo *tinfo)
 {
-       GBT_VARKEY *nk = NULL;
-       GBT_VARKEY *tmp = NULL;
-       GBT_VARKEY_R nr;
        GBT_VARKEY_R eo = gbt_var_key_readable(e);
+       GBT_VARKEY_R nr;
 
        if (eo.lower == eo.upper)       /* leaf */
        {
+               GBT_VARKEY *tmp;
+
                tmp = gbt_var_leaf2node(e, tinfo);
                if (tmp != e)
                        eo = gbt_var_key_readable(tmp);
@@ -239,25 +239,26 @@ gbt_var_bin_union(Datum *u, GBT_VARKEY *e, Oid collation,
 
        if (DatumGetPointer(*u))
        {
-
                GBT_VARKEY_R ro = gbt_var_key_readable((GBT_VARKEY *) DatumGetPointer(*u));
+               bool            update = false;
+
+               nr.lower = ro.lower;
+               nr.upper = ro.upper;
 
                if ((*tinfo->f_cmp) (ro.lower, eo.lower, collation) > 0)
                {
                        nr.lower = eo.lower;
-                       nr.upper = ro.upper;
-                       nk = gbt_var_key_copy(&nr, TRUE);
+                       update = true;
                }
 
                if ((*tinfo->f_cmp) (ro.upper, eo.upper, collation) < 0)
                {
                        nr.upper = eo.upper;
-                       nr.lower = ro.lower;
-                       nk = gbt_var_key_copy(&nr, TRUE);
+                       update = true;
                }
 
-               if (nk)
-                       *u = PointerGetDatum(nk);
+               if (update)
+                       *u = PointerGetDatum(gbt_var_key_copy(&nr, TRUE));
        }
        else
        {