diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2006-01-17 17:33:37 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2006-01-17 17:33:37 +0000 |
commit | 754da88e19e56a6aaba06a57f45fdf1b5ae792a3 (patch) | |
tree | 0dcbed1bb16054939b9f794a0637532e71f582c0 /src/backend/parser | |
parent | 8372956243a477a67f1d01674c86f0285f05ccbb (diff) | |
download | postgresql-754da88e19e56a6aaba06a57f45fdf1b5ae792a3.tar.gz postgresql-754da88e19e56a6aaba06a57f45fdf1b5ae792a3.zip |
Repair problems with the result of lookup_rowtype_tupdesc() possibly being
discarded by cache flush while still in use. This is a minimal patch that
just copies the tupdesc anywhere it could be needed across a flush. Applied
to back branches only; Neil Conway is working on a better long-term solution
for HEAD.
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/parse_coerce.c | 6 | ||||
-rw-r--r-- | src/backend/parser/parse_target.c | 5 |
2 files changed, 8 insertions, 3 deletions
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index 125c218bb55..869e870b66c 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.126.4.1 2006/01/12 22:29:22 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.126.4.2 2006/01/17 17:33:34 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -700,7 +700,7 @@ coerce_record_to_complex(ParseState *pstate, Node *node, format_type_be(RECORDOID), format_type_be(targetTypeId)))); - tupdesc = lookup_rowtype_tupdesc(targetTypeId, -1); + tupdesc = CreateTupleDescCopy(lookup_rowtype_tupdesc(targetTypeId, -1)); newargs = NIL; ucolno = 1; arg = list_head(args); @@ -758,6 +758,8 @@ coerce_record_to_complex(ParseState *pstate, Node *node, format_type_be(targetTypeId)), errdetail("Input has too many columns."))); + FreeTupleDesc(tupdesc); + rowexpr = makeNode(RowExpr); rowexpr->args = newargs; rowexpr->row_typeid = targetTypeId; diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index a6b1edbe48d..fc1ddc3dadb 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.129.4.1 2005/12/14 16:30:20 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.129.4.2 2006/01/17 17:33:34 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -839,6 +839,7 @@ ExpandIndirectionStar(ParseState *pstate, A_Indirection *ind) /* Verify it's a composite type, and get the tupdesc */ tupleDesc = lookup_rowtype_tupdesc(exprType(expr), exprTypmod(expr)); + tupleDesc = CreateTupleDescCopy(tupleDesc); /* Generate a list of references to the individual fields */ numAttrs = tupleDesc->natts; @@ -889,6 +890,8 @@ ExpandIndirectionStar(ParseState *pstate, A_Indirection *ind) te_list = lappend(te_list, te); } + FreeTupleDesc(tupleDesc); + return te_list; } |