Please, apply attached patch of contrib/btree_gist to 7.2.1 and current
authorBruce Momjian <bruce@momjian.us>
Fri, 22 Feb 2002 05:47:50 +0000 (05:47 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 22 Feb 2002 05:47:50 +0000 (05:47 +0000)
cvs.
The patch fixes memory leak during creation GiST index on timestamp
column.

Thank you.

--
Teodor Sigaev
teodor@stack.net

contrib/btree_gist/btree_gist.c

index 924062ed034fe9609249d0c0c155ccd46ed2c80d..c4eb8522130f4c290d1a5930ad3ba7f2e749dcf4 100644 (file)
@@ -86,6 +86,8 @@ Datum     gts_same(PG_FUNCTION_ARGS);
 static void gts_binary_union(Datum *r1, char *r2);
 static int tskey_cmp(const void *a, const void *b);
 
+#define TimestampGetDatumFast(X) Float8GetDatumFast(X)
+
 /* define for comparison */
 #define TSGE( ts1, ts2 ) (DatumGetBool(DirectFunctionCall2( \
        timestamp_ge, \
@@ -297,23 +299,11 @@ gts_compress(PG_FUNCTION_ARGS)
    if (entry->leafkey)
    {
        TSKEY      *r = (TSKEY *) palloc(sizeof(TSKEY));
-
        retval = palloc(sizeof(GISTENTRY));
-       if (entry->key)
-       {
-           r->lower = r->upper = *(Timestamp *) (entry->key);
-
-           gistentryinit(*retval, PointerGetDatum(r),
-                         entry->rel, entry->page,
-                         entry->offset, sizeof(TSKEY), FALSE);
-
-       }
-       else
-       {
-           gistentryinit(*retval, PointerGetDatum(NULL),
-                         entry->rel, entry->page,
-                         entry->offset, 0, FALSE);
-       }
+       r->lower = r->upper = *(Timestamp *) (entry->key);
+       gistentryinit(*retval, PointerGetDatum(r),
+             entry->rel, entry->page,
+             entry->offset, sizeof(TSKEY), FALSE);
    }
    else
        retval = entry;
@@ -408,8 +398,8 @@ gts_penalty(PG_FUNCTION_ARGS)
 
    intr = DatumGetIntervalP(DirectFunctionCall2(
                                                 timestamp_mi,
-                                     TimestampGetDatum(newentry->upper),
-                                  TimestampGetDatum(origentry->upper)));
+                                     TimestampGetDatumFast(newentry->upper),
+                                  TimestampGetDatumFast(origentry->upper)));
 
    /* see interval_larger */
    *result = Max(intr->time + intr->month * (30.0 * 86400), 0);
@@ -417,8 +407,8 @@ gts_penalty(PG_FUNCTION_ARGS)
 
    intr = DatumGetIntervalP(DirectFunctionCall2(
                                                 timestamp_mi,
-                                    TimestampGetDatum(origentry->lower),
-                                   TimestampGetDatum(newentry->lower)));
+                                    TimestampGetDatumFast(origentry->lower),
+                                   TimestampGetDatumFast(newentry->lower)));
 
    /* see interval_larger */
    *result += Max(intr->time + intr->month * (30.0 * 86400), 0);
@@ -483,8 +473,8 @@ tskey_cmp(const void *a, const void *b)
    return DatumGetInt32(
                         DirectFunctionCall2(
                                             timestamp_cmp,
-                 TimestampGetDatum(((TSKEY *) (((RIX *) a)->r))->lower),
-                  TimestampGetDatum(((TSKEY *) (((RIX *) b)->r))->lower)
+                 TimestampGetDatumFast(((TSKEY *) (((RIX *) a)->r))->lower),
+                  TimestampGetDatumFast(((TSKEY *) (((RIX *) b)->r))->lower)
                                             )
        );
 }