diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2001-11-02 16:30:29 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2001-11-02 16:30:29 +0000 |
commit | 7d05310828aae801fd1483e638771a4034cbecd7 (patch) | |
tree | 6362bc6eb2738bcd93c7ecffa6e3a4e94dad75be /src/backend/parser/parse_func.c | |
parent | 5d4b94085eda499b090dc019b821607065ce5745 (diff) | |
download | postgresql-7d05310828aae801fd1483e638771a4034cbecd7.tar.gz postgresql-7d05310828aae801fd1483e638771a4034cbecd7.zip |
Fix problem reported by Alex Korn: if a relation has been dropped and
recreated since the start of our transaction, our first reference to it
errored out because we'd try to reuse our old relcache entry for it.
Do this by accepting SI inval messages just before relcache search in
heap_openr, so that dead relcache entries will be flushed before we
search. Also, break heap_open/openr into two pairs of routines,
relation_open(r) and heap_open(r). The relation_open routines make
no tests on relkind and so can be used to open anything that has a
pg_class entry. The heap_open routines are wrappers that add a relkind
test to preserve their established behavior. Use the relation_open
routines in several places that had various kluge solutions for opening
rels that might be either heap or index rels.
Also, remove the old 'heap stats' code that's been superseded by Jan's
stats collector, and clean up some inconsistencies in error reporting
between the different types of ALTER TABLE.
Diffstat (limited to 'src/backend/parser/parse_func.c')
-rw-r--r-- | src/backend/parser/parse_func.c | 10 |
1 files changed, 3 insertions, 7 deletions
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index f6d94e5c552..1f2887031e4 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.112 2001/10/25 05:49:39 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.113 2001/11/02 16:30:29 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -131,7 +131,6 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs, List *i = NIL; Node *first_arg = NULL; char *refname; - Relation rd; int nargs = length(fargs); int argn; Func *funcnode; @@ -200,13 +199,10 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs, if (attisset) { toid = exprType(first_arg); - rd = heap_openr_nofail(typeidTypeName(toid)); - if (RelationIsValid(rd)) - heap_close(rd, NoLock); - else + argrelid = typeidTypeRelid(toid); + if (argrelid == InvalidOid) elog(ERROR, "Type '%s' is not a relation type", typeidTypeName(toid)); - argrelid = typeidTypeRelid(toid); /* * A projection must match an attribute name of the rel. |