diff options
Diffstat (limited to 'src/backend/parser/analyze.c')
-rw-r--r-- | src/backend/parser/analyze.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index f198ceb813f..0736572f0f9 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.262 2003/02/11 04:13:06 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.263 2003/02/13 20:45:21 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -23,6 +23,7 @@ #include "commands/prepare.h" #include "nodes/makefuncs.h" #include "optimizer/clauses.h" +#include "optimizer/var.h" #include "parser/analyze.h" #include "parser/gramparse.h" #include "parser/parsetree.h" @@ -1982,6 +1983,19 @@ transformSetOperationTree(ParseState *pstate, SelectStmt *stmt) Assert(length(selectList) == 1); selectQuery = (Query *) lfirst(selectList); + Assert(IsA(selectQuery, Query)); + + /* + * Check for bogus references to Vars on the current query level + * (but upper-level references are okay). + * Normally this can't happen because the namespace will be empty, + * but it could happen if we are inside a rule. + */ + if (pstate->p_namespace) + { + if (contain_vars_of_level((Node *) selectQuery, 1)) + elog(ERROR, "UNION/INTERSECT/EXCEPT member statement may not refer to other relations of same query level"); + } /* * Make the leaf query be a subquery in the top-level rangetable. |