aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils')
-rw-r--r--src/backend/utils/adt/rowtypes.c10
-rw-r--r--src/backend/utils/adt/ruleutils.c5
-rw-r--r--src/backend/utils/cache/typcache.c4
-rw-r--r--src/backend/utils/fmgr/funcapi.c6
4 files changed, 18 insertions, 7 deletions
diff --git a/src/backend/utils/adt/rowtypes.c b/src/backend/utils/adt/rowtypes.c
index 1a12185b048..04756db10c8 100644
--- a/src/backend/utils/adt/rowtypes.c
+++ b/src/backend/utils/adt/rowtypes.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/rowtypes.c,v 1.13 2005/10/15 02:49:29 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/rowtypes.c,v 1.13.2.1 2006/01/17 17:33:21 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -83,6 +83,7 @@ record_in(PG_FUNCTION_ARGS)
errmsg("input of anonymous composite types is not implemented")));
tupTypmod = -1; /* for all non-anonymous types */
tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
+ tupdesc = CreateTupleDescCopy(tupdesc);
ncolumns = tupdesc->natts;
/*
@@ -261,6 +262,7 @@ record_in(PG_FUNCTION_ARGS)
pfree(buf.data);
pfree(values);
pfree(nulls);
+ FreeTupleDesc(tupdesc);
PG_RETURN_HEAPTUPLEHEADER(result);
}
@@ -288,6 +290,7 @@ record_out(PG_FUNCTION_ARGS)
tupType = HeapTupleHeaderGetTypeId(rec);
tupTypmod = HeapTupleHeaderGetTypMod(rec);
tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
+ tupdesc = CreateTupleDescCopy(tupdesc);
ncolumns = tupdesc->natts;
/* Build a temporary HeapTuple control structure */
@@ -409,6 +412,7 @@ record_out(PG_FUNCTION_ARGS)
pfree(values);
pfree(nulls);
+ FreeTupleDesc(tupdesc);
PG_RETURN_CSTRING(buf.data);
}
@@ -449,6 +453,7 @@ record_recv(PG_FUNCTION_ARGS)
errmsg("input of anonymous composite types is not implemented")));
tupTypmod = -1; /* for all non-anonymous types */
tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
+ tupdesc = CreateTupleDescCopy(tupdesc);
ncolumns = tupdesc->natts;
/*
@@ -597,6 +602,7 @@ record_recv(PG_FUNCTION_ARGS)
heap_freetuple(tuple);
pfree(values);
pfree(nulls);
+ FreeTupleDesc(tupdesc);
PG_RETURN_HEAPTUPLEHEADER(result);
}
@@ -624,6 +630,7 @@ record_send(PG_FUNCTION_ARGS)
tupType = HeapTupleHeaderGetTypeId(rec);
tupTypmod = HeapTupleHeaderGetTypMod(rec);
tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
+ tupdesc = CreateTupleDescCopy(tupdesc);
ncolumns = tupdesc->natts;
/* Build a temporary HeapTuple control structure */
@@ -724,6 +731,7 @@ record_send(PG_FUNCTION_ARGS)
pfree(values);
pfree(nulls);
+ FreeTupleDesc(tupdesc);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 3e6e2ffac47..82830223999 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -3,7 +3,7 @@
* back to source text
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.207.2.3 2005/12/30 18:34:27 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.207.2.4 2006/01/17 17:33:21 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -2699,7 +2699,7 @@ get_name_for_var_field(Var *var, int fieldno,
/* Got the tupdesc, so we can extract the field name */
Assert(fieldno >= 1 && fieldno <= tupleDesc->natts);
- return NameStr(tupleDesc->attrs[fieldno - 1]->attname);
+ return pstrdup(NameStr(tupleDesc->attrs[fieldno - 1]->attname));
}
@@ -3493,6 +3493,7 @@ get_rule_expr(Node *node, deparse_context *context,
if (rowexpr->row_typeid != RECORDOID)
{
tupdesc = lookup_rowtype_tupdesc(rowexpr->row_typeid, -1);
+ tupdesc = CreateTupleDescCopy(tupdesc);
Assert(list_length(rowexpr->args) <= tupdesc->natts);
}
diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
index b681892ca9e..16025e2c6ff 100644
--- a/src/backend/utils/cache/typcache.c
+++ b/src/backend/utils/cache/typcache.c
@@ -36,7 +36,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/cache/typcache.c,v 1.15.2.1 2005/11/22 18:23:23 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/cache/typcache.c,v 1.15.2.2 2006/01/17 17:33:21 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -377,6 +377,8 @@ lookup_default_opclass(Oid type_id, Oid am_id)
*
* Note: returned TupleDesc points to cached copy; caller must copy it
* if intending to scribble on it or keep a reference for a long time.
+ * ("A long time" basically means "across any possible cache flush",
+ * which typically could occur at any relation open or catalog lookup.)
*/
TupleDesc
lookup_rowtype_tupdesc(Oid type_id, int32 typmod)
diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c
index 0a51f7ae0f2..565eb111027 100644
--- a/src/backend/utils/fmgr/funcapi.c
+++ b/src/backend/utils/fmgr/funcapi.c
@@ -7,7 +7,7 @@
* Copyright (c) 2002-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/fmgr/funcapi.c,v 1.26 2005/10/15 02:49:32 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/fmgr/funcapi.c,v 1.26.2.1 2006/01/17 17:33:21 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -246,7 +246,7 @@ get_expr_result_type(Node *expr,
*resultTupleDesc = NULL;
result = get_type_func_class(typid);
if (result == TYPEFUNC_COMPOSITE && resultTupleDesc)
- *resultTupleDesc = lookup_rowtype_tupdesc(typid, -1);
+ *resultTupleDesc = CreateTupleDescCopy(lookup_rowtype_tupdesc(typid, -1));
}
return result;
@@ -363,7 +363,7 @@ internal_get_result_type(Oid funcid,
{
case TYPEFUNC_COMPOSITE:
if (resultTupleDesc)
- *resultTupleDesc = lookup_rowtype_tupdesc(rettype, -1);
+ *resultTupleDesc = CreateTupleDescCopy(lookup_rowtype_tupdesc(rettype, -1));
/* Named composite types can't have any polymorphic columns */
break;
case TYPEFUNC_SCALAR: