Commit 549928d9 authored by Tom Lane's avatar Tom Lane

Fix for breakage of C-coded SRFs, from Joe Conway.

parent e2d156fa
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Copyright (c) 2002, PostgreSQL Global Development Group * Copyright (c) 2002, PostgreSQL Global Development Group
* *
* IDENTIFICATION * 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) ...@@ -83,8 +83,16 @@ per_MultiFuncCall(PG_FUNCTION_ARGS)
{ {
FuncCallContext *retval = (FuncCallContext *) fcinfo->flinfo->fn_extra; 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); ExecClearTuple(retval->slot);
return retval; return retval;
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* Copyright (c) 2002, PostgreSQL Global Development Group * 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); ...@@ -147,8 +147,12 @@ extern TupleTableSlot *TupleDescGetSlot(TupleDesc tupdesc);
extern AttInMetadata *TupleDescGetAttInMetadata(TupleDesc tupdesc); extern AttInMetadata *TupleDescGetAttInMetadata(TupleDesc tupdesc);
extern HeapTuple BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values); 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) \ #define TupleGetDatum(_slot, _tuple) \
PointerGetDatum(ExecStoreTuple(_tuple, _slot, InvalidBuffer, true)) PointerGetDatum(ExecStoreTuple(_tuple, _slot, InvalidBuffer, false))
/*---------- /*----------
......
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); CREATE TABLE foo2(fooid int, f2 int);
INSERT INTO foo2 VALUES(1, 11); INSERT INTO foo2 VALUES(1, 11);
INSERT INTO foo2 VALUES(2, 22); INSERT INTO foo2 VALUES(2, 22);
......
SELECT * FROM pg_settings WHERE name LIKE 'enable%';
CREATE TABLE foo2(fooid int, f2 int); CREATE TABLE foo2(fooid int, f2 int);
INSERT INTO foo2 VALUES(1, 11); INSERT INTO foo2 VALUES(1, 11);
INSERT INTO foo2 VALUES(2, 22); INSERT INTO foo2 VALUES(2, 22);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment