diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-10-19 21:23:20 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-10-19 21:23:20 +0000 |
commit | 76d09f4610cbf23ccc36649b35d8691ec5dcd1e1 (patch) | |
tree | 3d3548c6501a9aaba1ed68fc85d4395d9c6a5f09 /src/backend/parser/parse_func.c | |
parent | 0d93e385b0a16aa2b6e08f2f273ae87af4d82130 (diff) | |
download | postgresql-76d09f4610cbf23ccc36649b35d8691ec5dcd1e1.tar.gz postgresql-76d09f4610cbf23ccc36649b35d8691ec5dcd1e1.zip |
Fix case where a function in FROM returns a scalar type, but is
referred to with whole-tuple syntax.
Diffstat (limited to 'src/backend/parser/parse_func.c')
-rw-r--r-- | src/backend/parser/parse_func.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index 9a54a900aea..6c194f06c5b 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.137 2002/09/18 21:35:22 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.138 2002/10/19 21:23:20 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -191,9 +191,33 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, if (!OidIsValid(toid)) elog(ERROR, "Cannot find type OID for relation %u", rte->relid); + /* replace RangeVar in the arg list */ + lfirst(i) = makeVar(vnum, + InvalidAttrNumber, + toid, + sizeof(Pointer), + sublevels_up); break; case RTE_FUNCTION: toid = exprType(rte->funcexpr); + if (get_typtype(toid) == 'c') + { + /* func returns composite; same as relation case */ + lfirst(i) = makeVar(vnum, + InvalidAttrNumber, + toid, + sizeof(Pointer), + sublevels_up); + } + else + { + /* func returns scalar; use attno 1 instead */ + lfirst(i) = makeVar(vnum, + 1, + toid, + -1, + sublevels_up); + } break; default: @@ -210,13 +234,6 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, toid = InvalidOid; /* keep compiler quiet */ break; } - - /* replace RangeVar in the arg list */ - lfirst(i) = makeVar(vnum, - InvalidAttrNumber, - toid, - sizeof(Pointer), - sublevels_up); } else toid = exprType(arg); |