diff --git a/doc/src/sgml/spi.sgml b/doc/src/sgml/spi.sgml
index 6cdd50230d..72e1a813cb 100644
--- a/doc/src/sgml/spi.sgml
+++ b/doc/src/sgml/spi.sgml
@@ -1229,6 +1229,121 @@ TBD
+
+
+SPI_copytupledesc
+SPI - Tuple Descriptor Copy
+
+
+SPI_copytupledesc
+
+
+Makes copy of tuple descriptor in upper Executor context
+
+SPIcopying tuple descriptors
+SPI_copytupledesc
+
+
+
+2001-08-02
+
+
+SPI_copytupledesc(tupdesc)
+
+
+
+
+2001-08-02
+
+Inputs
+
+
+
+
+TupleDesc tupdesc
+
+
+
+Input tuple descriptor to be copied
+
+
+
+
+
+
+
+
+2001-08-02
+
+Outputs
+
+
+
+
+TupleDesc
+
+
+
+Copied tuple descriptor
+
+
+ non-NULL
+ if tupdesc
+ is not NULL and the copy was successful
+
+
+ NULL
+ only if tupdesc
+ is NULL
+
+
+
+
+
+
+
+
+
+
+
+2001-08-02
+
+Description
+
+
+SPI_copytupledesc
+ makes a copy of tupdesc in upper Executor context. See the section on Memory Management.
+
+
+
+Usage
+
+
+TBD
+
+
+
+
+
+
+
+
+
+
SPI_modifytuple
@@ -2647,10 +2762,13 @@ made in this context.
- After SPI_connect is called current context is the procedure's one. All
-allocations made via palloc/repalloc or by SPI utility functions (except
-for SPI_copytuple, SPI_modifytuple,
- SPI_palloc and SPI_repalloc) are
+ After SPI_connect is called current context is the
+ procedure's one. All allocations made via
+palloc/repalloc or by SPI utility
+functions (except for SPI_copytuple,
+SPI_copytupledesc,
+SPI_modifytuple,
+SPI_palloc and SPI_repalloc) are
made in this context.
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index 7b4030d580..8c6420ae4c 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.56 2001/08/02 16:05:23 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.57 2001/08/02 18:08:43 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -333,6 +333,33 @@ SPI_copytuple(HeapTuple tuple)
return ctuple;
}
+TupleDesc
+SPI_copytupledesc(TupleDesc tupdesc)
+{
+ MemoryContext oldcxt = NULL;
+ TupleDesc ctupdesc;
+
+ if (tupdesc == NULL)
+ {
+ SPI_result = SPI_ERROR_ARGUMENT;
+ return NULL;
+ }
+
+ if (_SPI_curid + 1 == _SPI_connected) /* connected */
+ {
+ if (_SPI_current != &(_SPI_stack[_SPI_curid + 1]))
+ elog(FATAL, "SPI: stack corrupted");
+ oldcxt = MemoryContextSwitchTo(_SPI_current->savedcxt);
+ }
+
+ ctupdesc = CreateTupleDescCopy(tupdesc);
+
+ if (oldcxt)
+ MemoryContextSwitchTo(oldcxt);
+
+ return ctupdesc;
+}
+
HeapTuple
SPI_modifytuple(Relation rel, HeapTuple tuple, int natts, int *attnum,
Datum *Values, char *Nulls)
@@ -1232,7 +1259,7 @@ _SPI_end_call(bool procmem)
}
static bool
-_SPI_checktuples()
+_SPI_checktuples(void)
{
uint32 processed = _SPI_current->processed;
SPITupleTable *tuptable = _SPI_current->tuptable;
@@ -1244,8 +1271,8 @@ _SPI_checktuples()
failed = true;
}
else
-/* some tuples were processed */
{
+ /* some tuples were processed */
if (tuptable == NULL) /* spi_printtup was not called */
failed = true;
else if (processed != (tuptable->alloced - tuptable->free))
diff --git a/src/include/executor/spi.h b/src/include/executor/spi.h
index 3a7c780794..bef68bc7a6 100644
--- a/src/include/executor/spi.h
+++ b/src/include/executor/spi.h
@@ -2,6 +2,7 @@
*
* spi.h
*
+ * $Id: spi.h,v 1.28 2001/08/02 18:08:43 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -48,17 +49,17 @@ typedef struct
HeapTuple *vals; /* tuples */
} SPITupleTable;
-#define SPI_ERROR_CONNECT -1
-#define SPI_ERROR_COPY -2
-#define SPI_ERROR_OPUNKNOWN -3
-#define SPI_ERROR_UNCONNECTED -4
-#define SPI_ERROR_CURSOR -5
-#define SPI_ERROR_ARGUMENT -6
-#define SPI_ERROR_PARAM -7
-#define SPI_ERROR_TRANSACTION -8
-#define SPI_ERROR_NOATTRIBUTE -9
-#define SPI_ERROR_NOOUTFUNC -10
-#define SPI_ERROR_TYPUNKNOWN -11
+#define SPI_ERROR_CONNECT (-1)
+#define SPI_ERROR_COPY (-2)
+#define SPI_ERROR_OPUNKNOWN (-3)
+#define SPI_ERROR_UNCONNECTED (-4)
+#define SPI_ERROR_CURSOR (-5)
+#define SPI_ERROR_ARGUMENT (-6)
+#define SPI_ERROR_PARAM (-7)
+#define SPI_ERROR_TRANSACTION (-8)
+#define SPI_ERROR_NOATTRIBUTE (-9)
+#define SPI_ERROR_NOOUTFUNC (-10)
+#define SPI_ERROR_TYPUNKNOWN (-11)
#define SPI_OK_CONNECT 1
#define SPI_OK_FINISH 2
@@ -87,6 +88,7 @@ extern void *SPI_saveplan(void *plan);
extern int SPI_freeplan(void *plan);
extern HeapTuple SPI_copytuple(HeapTuple tuple);
+extern TupleDesc SPI_copytupledesc(TupleDesc tupdesc);
extern HeapTuple SPI_modifytuple(Relation rel, HeapTuple tuple, int natts,
int *attnum, Datum *Values, char *Nulls);
extern int SPI_fnumber(TupleDesc tupdesc, char *fname);