aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_func.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-10-19 21:23:20 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-10-19 21:23:20 +0000
commit76d09f4610cbf23ccc36649b35d8691ec5dcd1e1 (patch)
tree3d3548c6501a9aaba1ed68fc85d4395d9c6a5f09 /src/backend/parser/parse_func.c
parent0d93e385b0a16aa2b6e08f2f273ae87af4d82130 (diff)
downloadpostgresql-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.c33
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);