]> granicus.if.org Git - postgresql/commitdiff
Fix for breakage of C-coded SRFs, from Joe Conway.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 30 Aug 2002 19:56:49 +0000 (19:56 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 30 Aug 2002 19:56:49 +0000 (19:56 +0000)
src/backend/utils/fmgr/funcapi.c
src/include/funcapi.h
src/test/regress/expected/rangefuncs.out
src/test/regress/sql/rangefuncs.sql

index 35ba972fe12051d536fc2dc1a384c06ff2a5300c..0df872cf928651b050b7fd0768e9ca2e81d46690 100644 (file)
@@ -7,7 +7,7 @@
  * Copyright (c) 2002, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/fmgr/funcapi.c,v 1.4 2002/08/29 17:14:33 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/fmgr/funcapi.c,v 1.5 2002/08/30 19:56:49 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -83,8 +83,16 @@ per_MultiFuncCall(PG_FUNCTION_ARGS)
 {
        FuncCallContext *retval = (FuncCallContext *) fcinfo->flinfo->fn_extra;
 
-       /* make sure we start with a fresh slot */
-       if(retval->slot != NULL)
+       /*
+        * Clear the TupleTableSlot, if present.  This is for safety's sake:
+        * the Slot will be in a long-lived context (it better be, if the
+        * FuncCallContext is pointing to it), but in most usage patterns the
+        * tuples stored in it will be in the function's per-tuple context.
+        * So at the beginning of each call, the Slot will hold a dangling
+        * pointer to an already-recycled tuple.  We clear it out here.  (See
+        * also the definition of TupleGetDatum() in funcapi.h!)
+        */
+       if (retval->slot != NULL)
                ExecClearTuple(retval->slot);
 
        return retval;
index fcfb6acb69448a7f9a25698447ee8326ede4fdba..ba862b6b1ffde2a4e430edac56a3883a708c7442 100644 (file)
@@ -9,7 +9,7 @@
  *
  * Copyright (c) 2002, PostgreSQL Global Development Group
  *
- * $Id: funcapi.h,v 1.6 2002/08/29 17:14:33 tgl Exp $
+ * $Id: funcapi.h,v 1.7 2002/08/30 19:56:49 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -147,8 +147,12 @@ extern TupleTableSlot *TupleDescGetSlot(TupleDesc tupdesc);
 extern AttInMetadata *TupleDescGetAttInMetadata(TupleDesc tupdesc);
 extern HeapTuple BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values);
 
+/*
+ * Note we pass shouldFree = false; this is needed because the tuple will
+ * typically be in a shorter-lived memory context than the TupleTableSlot.
+ */
 #define TupleGetDatum(_slot, _tuple) \
-       PointerGetDatum(ExecStoreTuple(_tuple, _slot, InvalidBuffer, true))
+       PointerGetDatum(ExecStoreTuple(_tuple, _slot, InvalidBuffer, false))
 
 
 /*----------
index bf7d2df24dc96b970a7693805d334dd734048666..844cccc63921c942486abc1ce51a0cb3e970423a 100644 (file)
@@ -1,3 +1,15 @@
+SELECT * FROM pg_settings WHERE name LIKE 'enable%';
+       name       | setting 
+------------------+---------
+ enable_hashjoin  | on
+ enable_indexscan | on
+ enable_mergejoin | on
+ enable_nestloop  | on
+ enable_seqscan   | on
+ enable_sort      | on
+ enable_tidscan   | on
+(7 rows)
+
 CREATE TABLE foo2(fooid int, f2 int);
 INSERT INTO foo2 VALUES(1, 11);
 INSERT INTO foo2 VALUES(2, 22);
index 03a3a558461493884402216183427751e5ba7d8c..6522fdda10d96ea651d63a5caf166c8e06edf688 100644 (file)
@@ -1,3 +1,5 @@
+SELECT * FROM pg_settings WHERE name LIKE 'enable%';
+
 CREATE TABLE foo2(fooid int, f2 int);
 INSERT INTO foo2 VALUES(1, 11);
 INSERT INTO foo2 VALUES(2, 22);