* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.193 2001/07/16 05:06:58 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.194 2001/08/11 00:02:13 tgl Exp $
*
*-------------------------------------------------------------------------
*/
* If a list of column names was given, run through and
* insert these into the actual query tree. - thomas
* 2000-03-08
+ *
+ * Outer loop is over targetlist to make it easier to
+ * skip junk targetlist entries.
*/
if (n->aliases != NIL)
{
- int i;
- List *targetList = n->query->targetList;
-
- if (length(targetList) < length(n->aliases))
- elog(ERROR, "CREATE VIEW specifies %d columns"
- " but only %d columns are present",
- length(targetList), length(n->aliases));
+ List *aliaslist = n->aliases;
+ List *targetList;
- for (i = 0; i < length(n->aliases); i++)
+ foreach(targetList, n->query->targetList)
{
- Ident *id;
- TargetEntry *te;
+ TargetEntry *te = (TargetEntry *) lfirst(targetList);
Resdom *rd;
+ Ident *id;
- id = nth(i, n->aliases);
- Assert(IsA(id, Ident));
- te = nth(i, targetList);
Assert(IsA(te, TargetEntry));
rd = te->resdom;
Assert(IsA(rd, Resdom));
+ if (rd->resjunk) /* junk columns don't get aliases */
+ continue;
+ id = (Ident *) lfirst(aliaslist);
+ Assert(IsA(id, Ident));
rd->resname = pstrdup(id->name);
+ aliaslist = lnext(aliaslist);
+ if (aliaslist == NIL)
+ break; /* done assigning aliases */
}
+
+ if (aliaslist != NIL)
+ elog(ERROR, "CREATE VIEW specifies more column names than columns");
}
result = makeNode(Query);
result->commandType = CMD_UTILITY;