]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Add Var.varlevelup to code. More parser cleanup.
authorBruce Momjian <bruce@momjian.us>
Tue, 20 Jan 1998 22:12:17 +0000 (22:12 +0000)
committerBruce Momjian <bruce@momjian.us>
Tue, 20 Jan 1998 22:12:17 +0000 (22:12 +0000)
25 files changed:
src/backend/commands/recipe.c
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/nodes/makefuncs.c
src/backend/nodes/outfuncs.c
src/backend/nodes/readfuncs.c
src/backend/optimizer/plan/createplan.c
src/backend/optimizer/plan/initsplan.c
src/backend/optimizer/plan/planmain.c
src/backend/optimizer/plan/setrefs.c
src/backend/optimizer/prep/preptlist.c
src/backend/optimizer/util/clauses.c
src/backend/optimizer/util/tlist.c
src/backend/optimizer/util/var.c
src/backend/parser/README
src/backend/parser/analyze.c
src/backend/parser/parse_clause.c
src/backend/parser/parse_expr.c
src/backend/parser/parse_func.c
src/backend/parser/parse_node.c
src/backend/parser/parse_relation.c
src/include/nodes/makefuncs.h
src/include/nodes/primnodes.h
src/include/parser/parse_node.h
src/include/parser/parse_relation.h

index bfdfe9d78fd3a96cf101ba84531ed7beeb626a4e..96808a6e3115f8003f2917ddc18a4ebb24ccdb9c 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/Attic/recipe.c,v 1.17 1998/01/05 16:38:57 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/Attic/recipe.c,v 1.18 1998/01/20 22:10:53 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -494,6 +494,7 @@ tg_replaceNumberedParam(Node *expression,
                                                        newVar = makeVar(rt_ind,
                                                                                         0, /* the whole tuple */
                                                                                   TypeGet(teeRelName, &defined),
+                                                                                    0,
                                                                                         rt_ind,
                                                                                         0);
                                                        return (Node *) newVar;
@@ -503,6 +504,7 @@ tg_replaceNumberedParam(Node *expression,
                                                                                         1, /* just the first field,
                                                                                                 * which is 'result' */
                                                                                   TypeGet(teeRelName, &defined),
+                                                                                    0,
                                                                                         rt_ind,
                                                                                         0);
                                                return (Node *) newVar;
index d6cc4cd5470c27a0faeb0f49051b668529e5b017..c3b98a555f51fca284db02a1b93547497104f897 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.34 1998/01/20 05:03:40 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.35 1998/01/20 22:10:58 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -671,6 +671,7 @@ _copyVar(Var *from)
        newnode->varno = from->varno;
        newnode->varattno = from->varattno;
        newnode->vartype = from->vartype;
+       newnode->varlevelsup = from->varlevelsup;
 
        newnode->varnoold = from->varnoold;
        newnode->varoattno = from->varoattno;
index d569bd471283e43d08a83a1b919e1cf7c47dd29b..bfed02b5e568a30ed1142f22aba46c696142326c 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.12 1998/01/07 21:03:26 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.13 1998/01/20 22:11:02 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -129,6 +129,8 @@ _equalVar(Var *a, Var *b)
                return (false);
        if (a->vartype != b->vartype)
                return (false);
+       if (a->varlevelsup != b->varlevelsup)
+               return (false);
        if (a->varnoold != b->varnoold)
                return (false);
        if (a->varoattno != b->varoattno)
index 95cce161d6675fda28f4a236c141c82c67c9e150..af5003e87732271c0e93c216bafb098493dc2e9d 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/makefuncs.c,v 1.4 1997/09/08 02:23:39 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/makefuncs.c,v 1.5 1998/01/20 22:11:05 momjian Exp $
  *
  * NOTES
  *       Creator functions in POSTGRES 4.2 are generated automatically. Most of
@@ -53,6 +53,7 @@ Var              *
 makeVar(Index varno,
                AttrNumber varattno,
                Oid vartype,
+               Index varlevelsup,
                Index varnoold,
                AttrNumber varoattno)
 {
@@ -61,6 +62,7 @@ makeVar(Index varno,
        var->varno = varno;
        var->varattno = varattno;
        var->vartype = vartype;
+       var->varlevelsup = varlevelsup;
        var->varnoold = varnoold;
        var->varoattno = varoattno;
 
index d7ede89e65c49dc49d635b45e3f9120aea46c712..6f69c34983ce410b6c9d156c82ebed8927162399 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.25 1998/01/20 05:03:49 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.26 1998/01/20 22:11:12 momjian Exp $
  *
  * NOTES
  *       Every (plan) node in POSTGRES has an associated "out" routine which
@@ -698,6 +698,8 @@ _outVar(StringInfo str, Var *node)
        appendStringInfo(str, buf);
        sprintf(buf, " :vartype %u ", node->vartype);
        appendStringInfo(str, buf);
+       sprintf(buf, " :varlevelsup %u ", node->varlevelsup);
+       appendStringInfo(str, buf);
        sprintf(buf, " :varnoold %d ", node->varnoold);
        appendStringInfo(str, buf);
        sprintf(buf, " :varoattno %d ", node->varoattno);
index 2860bad174a6a1945d9d1cf41039f4152b9d59e4..d0bcf13875fed190d5cce4340b219b7620a05835 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.21 1998/01/20 05:03:57 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.22 1998/01/20 22:11:15 momjian Exp $
  *
  * NOTES
  *       Most of the read functions for plan nodes are tested. (In fact, they
@@ -814,6 +814,10 @@ _readVar()
        token = lsptok(NULL, &length);          /* get vartype */
        local_node->vartype = (Oid) atol(token);
 
+       token = lsptok(NULL, &length);          /* eat :varlevelsup */
+       token = lsptok(NULL, &length);          /* get varlevelsup */
+       local_node->varlevelsup = (Oid) atol(token);
+
        token = lsptok(NULL, &length);          /* eat :varnoold */
        token = lsptok(NULL, &length);          /* get varnoold */
        local_node->varnoold = (Oid) atol(token);
index 970a6a5ffb7dd47db93ab44e3c5d16695662f327..2b53f1875fe6d1d76d2ba3e4a323219dfd0a8fa7 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.23 1998/01/15 18:59:37 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.24 1998/01/20 22:11:25 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -701,6 +701,7 @@ fix_indxqual_references(Node *clause, Path *index_path)
                makeVar((Index) lfirsti(index_path->parent->relids),
                                1,                              /* func indices have one key */
                                ((Func *) ((Expr *) clause)->oper)->functype,
+                               0,
                                (Index) lfirsti(index_path->parent->relids),
                                0);
 
index d7edd0aaea0cf7137c0e4dfc0de2c8c46b9cefa8..cb0bd085875ac2fdaffdba3bbf955d706252ae83 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.8 1997/09/08 21:45:19 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.9 1998/01/20 22:11:27 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -116,7 +116,7 @@ add_missing_vars_to_base_rels(Query *root, List *tlist)
                        !rel_member(relids, root->base_relation_list_))
                {
 
-                       var = makeVar(varno, -2, 26, varno, -2);
+                       var = makeVar(varno, -2, 26, 0, varno, -2);
                        /* add it to base_relation_list_ */
                        result = get_base_rel(root, varno);
                        add_tl_element(result, var);
index b8b99149ce5a8e0440426b741c21614e2fe0e404..1c59f64a4c84293893cd23f4acc271b7960253dd 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.16 1998/01/15 18:59:44 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.17 1998/01/20 22:11:29 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -464,7 +464,7 @@ make_groupPlan(List **tlist,
                else
                        te->expr = (Node *) makeVar(1, resdom->resno,
                                                                                resdom->restype,
-                                                                               -1, resdom->resno);
+                                                                               0, -1, resdom->resno);
        }
 
        sortplan = make_sort(sort_tlist,
index fe80a658f0a1f08838f3ae33723719178937934a..284ac836f63603b0176b0f4d32503a811266aa3c 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.15 1998/01/15 18:59:50 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.16 1998/01/20 22:11:32 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -440,6 +440,7 @@ replace_joinvar_refs(Var *var, List *outer_tlist, List *inner_tlist)
                return (makeVar(OUTER,
                                                outer_resdom->resno,
                                                var->vartype,
+                                               0,
                                                var->varnoold,
                                                var->varoattno));
        }
@@ -453,6 +454,7 @@ replace_joinvar_refs(Var *var, List *outer_tlist, List *inner_tlist)
                        return (makeVar(INNER,
                                                        inner_resdom->resno,
                                                        var->vartype,
+                                                       0,
                                                        var->varnoold,
                                                        var->varoattno));
                }
@@ -497,6 +499,7 @@ tlist_temp_references(Oid tempid,
                                           (Node *) makeVar(tempid,
                                                                                xtl->resdom->resno,
                                                                                xtl->resdom->restype,
+                                                                               0,
                                                                                tempid,
                                                                                oattno));
 
index e92fbb333220622046f544f20705d2674bac033d..ad2c697db5a4533bed2851e2a21eb8bb1de3f541 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/prep/preptlist.c,v 1.7 1998/01/16 23:20:09 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/prep/preptlist.c,v 1.8 1998/01/20 22:11:34 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -114,7 +114,7 @@ preprocess_targetlist(List *tlist,
                                                        0,
                                                        1);
 
-               var = makeVar(result_relation, -1, 27, result_relation, -1);
+               var = makeVar(result_relation, -1, 27, 0, result_relation, -1);
 
                ctid = makeNode(TargetEntry);
                ctid->resdom = resdom;
@@ -322,7 +322,7 @@ new_relation_targetlist(Oid relid, Index rt_index, NodeTag node_type)
                                        TargetEntry *temp_list = NULL;
 
                                        temp_var =
-                                               makeVar(rt_index, attno, atttype, rt_index, attno);
+                                               makeVar(rt_index, attno, atttype, 0, rt_index, attno);
 
                                        temp_list = MakeTLE(makeResdom(attno,
                                                                                                   atttype,
index eab49abb1f5b12e6dae71c25d077541089f1487e..6f42df8ceb65fb938390088df0f1dbf5bfebbf17 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.13 1997/12/22 05:42:14 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.14 1998/01/20 22:11:39 momjian Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -377,7 +377,8 @@ clause_relids_vars(Node *clause, List **relids, List **vars)
                        Var                *in_list = (Var *) lfirst(vi);
 
                        if (in_list->varno == var->varno &&
-                               in_list->varattno == var->varattno)
+                               in_list->varattno == var->varattno &&
+                               in_list->varlevelsup == var->varlevelsup)
                                break;
                }
                if (vi == NIL)
index aa867f4b5a3845ef8194a036ff844072c0f885e8..edac3e8bf4bd0b13acf8ba893cd75a5c37b00752 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/tlist.c,v 1.8 1997/11/25 22:00:16 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/tlist.c,v 1.9 1998/01/20 22:11:41 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -108,6 +108,7 @@ add_tl_element(Rel *rel, Var *var)
                Var                *newvar = makeVar(var->varno,
                                                                         var->varattno,
                                                                         var->vartype,
+                                                                        var->varlevelsup,
                                                                         var->varno,
                                                                         var->varoattno);
 
@@ -287,7 +288,8 @@ match_varid(Var *test_var, List *tlist)
                 * changed to INNER/OUTER.
                 */
                if (tlvar->varnoold == test_var->varnoold &&
-                       tlvar->varoattno == test_var->varoattno)
+                       tlvar->varoattno == test_var->varoattno &&
+                       tlvar->varlevelsup == test_var->varlevelsup)
                {
 
                        if (tlvar->vartype == type_var)
index 7ba3ce5d97572337ce18144f1be87a2e65580954..e3ed305ed88ebce158a91dc5d6432f7b0c6f61e3 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.7 1997/12/22 05:42:16 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.8 1998/01/20 22:11:43 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -209,6 +209,7 @@ var_equal(Var *var1, Var *var2)
        if (IsA(var1, Var) &&IsA(var2, Var) &&
                (((Var *) var1)->varno == ((Var *) var2)->varno) &&
                (((Var *) var1)->vartype == ((Var *) var2)->vartype) &&
+               (((Var *) var1)->varlevelsup == ((Var *) var2)->varlevelsup) &&
                (((Var *) var1)->varattno == ((Var *) var2)->varattno))
        {
 
index 402f193bc6a924f0f8b4fa5a28ea45a80fdf2425..b67e1909d9e1ab11aac1136f5d323ca790db84bb 100644 (file)
@@ -12,7 +12,7 @@ parse_clause.c        handle clauses like WHERE, ORDER BY, GROUP BY, ...
 parse_expr.c   handle expressions like col, col + 3, x = 3 or x = 4
 parse_oper.c   handle operations in expressions
 parse_agg.c    handle aggregates, like SUM(col1),  AVG(col2), ...
-parse_func.c   handle functions like date_part(col3), trim(col4), ...
+parse_func.c   handle functions, table.column and column identifiers
 
 parse_node.c   create nodes for various structures
 parse_target.c handle the result list of the query
index 077215138f71e41f94f732753ae33227eea05646..a494106fd51d21687cd25a40d4c99c3413c2e350 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.67 1998/01/20 05:04:05 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.68 1998/01/20 22:11:51 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -219,7 +219,7 @@ transformDeleteStmt(ParseState *pstate, DeleteStmt *stmt)
        qry->qual = transformWhereClause(pstate, stmt->whereClause);
 
        qry->rtable = pstate->p_rtable;
-       qry->resultRelation = refnameRangeTablePosn(pstate->p_rtable, stmt->relname);
+       qry->resultRelation = refnameRangeTablePosn(pstate, stmt->relname, NULL);
 
        qry->hasAggs = pstate->p_hasAggs;
        if (pstate->p_hasAggs)
@@ -320,7 +320,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
 
        /* now the range table will not change */
        qry->rtable = pstate->p_rtable;
-       qry->resultRelation = refnameRangeTablePosn(pstate->p_rtable, stmt->relname);
+       qry->resultRelation = refnameRangeTablePosn(pstate, stmt->relname, NULL);
 
        qry->groupClause = transformGroupClause(pstate,
                                                                                        stmt->groupClause,
@@ -816,7 +816,7 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
 
        qry->rtable = pstate->p_rtable;
 
-       qry->resultRelation = refnameRangeTablePosn(pstate->p_rtable, stmt->relname);
+       qry->resultRelation = refnameRangeTablePosn(pstate, stmt->relname, NULL);
 
        qry->hasAggs = pstate->p_hasAggs;
        if (pstate->p_hasAggs)
index 115b8c153d79c27b409ebde7f9031e5799937844..8e571af58f9bd30d07e0dc94709811004eefd5e3 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.10 1998/01/20 05:04:12 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.11 1998/01/20 22:11:53 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -39,16 +39,15 @@ void
 makeRangeTable(ParseState *pstate, char *relname, List *frmList)
 {
        RangeTblEntry *rte;
-
+       
        parseFromClause(pstate, frmList);
 
        if (relname == NULL)
                return;
 
-       if (refnameRangeTablePosn(pstate->p_rtable, relname) < 1)
-               rte = addRangeTableEntry(pstate, relname, relname, FALSE, FALSE);
-       else
-               rte = refnameRangeTableEntry(pstate->p_rtable, relname);
+       Assert(pstate->p_rtable == NULL);
+
+       rte = addRangeTableEntry(pstate, relname, relname, FALSE, FALSE);
 
        pstate->p_target_rangetblentry = rte;
        Assert(pstate->p_target_relation == NULL);
@@ -137,8 +136,7 @@ find_targetlist_entry(ParseState *pstate, SortGroupBy *sortgroupby, List *tlist)
        TargetEntry *target_result = NULL;
 
        if (sortgroupby->range)
-               real_rtable_pos = refnameRangeTablePosn(pstate->p_rtable,
-                                                                                               sortgroupby->range);
+               real_rtable_pos = refnameRangeTablePosn(pstate, sortgroupby->range, NULL);
 
        foreach(i, tlist)
        {
index ef42a61fe29867c10f9d6e01b900ad2709f3be81..485054eac11dec8cf299493ac0a3ee32376ca0fd 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.11 1998/01/20 05:04:14 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.12 1998/01/20 22:11:55 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -304,6 +304,7 @@ transformIdent(ParseState *pstate, Node *expr, int precedence)
        {
                Attr       *att = makeNode(Attr);
 
+               /* we add the relation name for them */
                att->relname = rte->refname;
                att->attrs = lcons(makeString(ident->name), NIL);
                column_result =
@@ -312,7 +313,7 @@ transformIdent(ParseState *pstate, Node *expr, int precedence)
        }
 
        /* try to find the ident as a relation */
-       if (refnameRangeTableEntry(pstate->p_rtable, ident->name) != NULL)
+       if (refnameRangeTableEntry(pstate, ident->name) != NULL)
        {
                ident->isRel = TRUE;
                relation_result = (Node *) ident;
index e8466fa62640a92700c9d9281e5219960a032530..d864dfc1f6d9f26eff7a2e1e262c167950fe6da0 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.7 1998/01/20 05:04:16 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.8 1998/01/20 22:11:55 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -174,13 +174,12 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
                {
                        RangeTblEntry *rte;
                        Ident      *ident = (Ident *) first_arg;
-
                        /*
                         * first arg is a relation. This could be a projection.
                         */
                        refname = ident->name;
 
-                       rte = refnameRangeTableEntry(pstate->p_rtable, refname);
+                       rte = refnameRangeTableEntry(pstate, refname);
                        if (rte == NULL)
                                rte = addRangeTableEntry(pstate, refname, refname, FALSE, FALSE);
 
@@ -196,6 +195,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
                                Oid                     dummyTypeId;
 
                                return ((Node *) make_var(pstate,
+                                                                          relid,
                                                                           refname,
                                                                           funcname,
                                                                           &dummyTypeId));
@@ -288,19 +288,18 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
 
                if (nodeTag(pair) == T_Ident && ((Ident *) pair)->isRel)
                {
-
                        /*
                         * a relation
                         */
                        refname = ((Ident *) pair)->name;
 
-                       rte = refnameRangeTableEntry(pstate->p_rtable, refname);
+                       rte = refnameRangeTableEntry(pstate, refname);
                        if (rte == NULL)
                                rte = addRangeTableEntry(pstate, refname, refname,
                                                                                 FALSE, FALSE);
                        relname = rte->relname;
 
-                       vnum = refnameRangeTablePosn(pstate->p_rtable, rte->refname);
+                       vnum = refnameRangeTablePosn(pstate, rte->refname, NULL);
 
                        /*
                         * for func(relname), the param to the function is the tuple
@@ -312,7 +311,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
                        toid = typeTypeId(typenameType(relname));
                        /* replace it in the arg list */
                        lfirst(fargs) =
-                               makeVar(vnum, 0, toid, vnum, 0);
+                               makeVar(vnum, 0, toid, 0, vnum, 0);
                }
                else if (!attisset)
                {                                               /* set functions don't have parameters */
@@ -1074,7 +1073,7 @@ setup_tlist(char *attname, Oid relid)
                                                 0,
                                                 (Oid) 0,
                                                 0);
-       varnode = makeVar(-1, attno, typeid, -1, attno);
+       varnode = makeVar(-1, attno, typeid, 0, -1, attno);
 
        tle = makeNode(TargetEntry);
        tle->resdom = resnode;
@@ -1101,7 +1100,7 @@ setup_base_tlist(Oid typeid)
                                                 0,
                                                 (Oid) 0,
                                                 0);
-       varnode = makeVar(-1, 1, typeid, -1, 1);
+       varnode = makeVar(-1, 1, typeid, 0, -1, 1);
        tle = makeNode(TargetEntry);
        tle->resdom = resnode;
        tle->expr = (Node *) varnode;
index ffcafcedb11fd00622be340c0272912d9510bf57..02e5108752643947577754a6198f3d3512426d8c 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_node.c,v 1.9 1998/01/20 05:04:21 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_node.c,v 1.10 1998/01/20 22:11:57 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -239,27 +239,24 @@ make_op(char *opname, Node *ltree, Node *rtree)
 }
 
 Var               *
-make_var(ParseState *pstate, char *refname, char *attrname, Oid *type_id)
+make_var(ParseState *pstate, Oid relid, char *refname,
+                               char *attrname, Oid *type_id)
 {
        Var                *varnode;
        int                     vnum,
                                attid;
        Oid                     vartypeid;
-       RangeTblEntry *rte;
+       int                     sublevels_up;
 
-       rte = refnameRangeTableEntry(pstate->p_rtable, refname);
-       if (rte == NULL)
-               rte = addRangeTableEntry(pstate, refname, refname, FALSE, FALSE);
+       vnum = refnameRangeTablePosn(pstate, refname, &sublevels_up);
 
-       vnum = refnameRangeTablePosn(pstate->p_rtable, refname);
-
-       attid = get_attnum(rte->relid, attrname);
+       attid = get_attnum(relid, attrname);
        if (attid == InvalidAttrNumber)
                elog(ERROR, "Relation %s does not have attribute %s",
-                        rte->relname, attrname);
-       vartypeid = get_atttype(rte->relid, attid);
+                        refname, attrname);
+       vartypeid = get_atttype(relid, attid);
 
-       varnode = makeVar(vnum, attid, vartypeid, vnum, attid);
+       varnode = makeVar(vnum, attid, vartypeid, sublevels_up, vnum, attid);
        *type_id = vartypeid;
 
        return varnode;
index 5009b0326bdadffcd96ca01eecd3c609c30d877a..f4078c9dfaf72eb5287d81d31608b90709b9c955 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.7 1998/01/20 05:04:24 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.8 1998/01/20 22:12:01 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -67,35 +67,57 @@ static char *attnum_type[SPECIALS] = {
 
 /* given refname, return a pointer to the range table entry */
 RangeTblEntry *
-refnameRangeTableEntry(List *rtable, char *refname)
+refnameRangeTableEntry(ParseState *pstate, char *refname)
 {
        List       *temp;
 
-       foreach(temp, rtable)
+       while (pstate != NULL)
        {
-               RangeTblEntry *rte = lfirst(temp);
-
-               if (!strcmp(rte->refname, refname))
-                       return rte;
+               foreach(temp, pstate->p_rtable)
+               {
+                       RangeTblEntry *rte = lfirst(temp);
+       
+                       if (!strcmp(rte->refname, refname))
+                               return rte;
+               }
+               /* only allow correlated columns in WHERE clause */
+               if (pstate->p_in_where_clause)
+                       pstate = pstate->parentParseState;
+               else    break;
        }
        return NULL;
 }
 
 /* given refname, return id of variable; position starts with 1 */
 int
-refnameRangeTablePosn(List *rtable, char *refname)
+refnameRangeTablePosn(ParseState *pstate, char *refname, int *sublevels_up)
 {
        int                     index;
        List       *temp;
 
-       index = 1;
-       foreach(temp, rtable)
-       {
-               RangeTblEntry *rte = lfirst(temp);
+       
+       if (sublevels_up)
+               *sublevels_up = 0;
 
-               if (!strcmp(rte->refname, refname))
-                       return index;
-               index++;
+       while (pstate != NULL)
+       {
+               index = 1;
+               foreach(temp, pstate->p_rtable)
+               {
+                       RangeTblEntry *rte = lfirst(temp);
+       
+                       if (!strcmp(rte->refname, refname))
+                               return index;
+                       index++;
+               }
+               /* only allow correlated columns in WHERE clause */
+               if (pstate->p_in_where_clause)
+               {
+                       pstate = pstate->parentParseState;
+                       if (sublevels_up)
+                               (*sublevels_up)++;
+               }
+               else    break;
        }
        return 0;
 }
@@ -110,31 +132,38 @@ colnameRangeTableEntry(ParseState *pstate, char *colname)
        List       *rtable;
        RangeTblEntry *rte_result;
 
-       if (pstate->p_is_rule)
-               rtable = lnext(lnext(pstate->p_rtable));
-       else
-               rtable = pstate->p_rtable;
-
        rte_result = NULL;
-       foreach(et, rtable)
+       while (pstate != NULL)
        {
-               RangeTblEntry *rte = lfirst(et);
-
-               /* only entries on outer(non-function?) scope */
-               if (!rte->inFromCl && rte != pstate->p_target_rangetblentry)
-                       continue;
+               if (pstate->p_is_rule)
+                       rtable = lnext(lnext(pstate->p_rtable));
+               else
+                       rtable = pstate->p_rtable;
 
-               if (get_attnum(rte->relid, colname) != InvalidAttrNumber)
+               foreach(et, rtable)
                {
-                       if (rte_result != NULL)
+                       RangeTblEntry *rte = lfirst(et);
+       
+                       /* only entries on outer(non-function?) scope */
+                       if (!rte->inFromCl && rte != pstate->p_target_rangetblentry)
+                               continue;
+       
+                       if (get_attnum(rte->relid, colname) != InvalidAttrNumber)
                        {
-                               if (!pstate->p_is_insert ||
-                                       rte != pstate->p_target_rangetblentry)
-                                       elog(ERROR, "Column %s is ambiguous", colname);
+                               if (rte_result != NULL)
+                               {
+                                       if (!pstate->p_is_insert ||
+                                               rte != pstate->p_target_rangetblentry)
+                                               elog(ERROR, "Column %s is ambiguous", colname);
+                               }
+                               else
+                                       rte_result = rte;
                        }
-                       else
-                               rte_result = rte;
                }
+               /* only allow correlated columns in WHERE clause */
+               if (pstate->p_in_where_clause && rte_result == NULL)
+                       pstate = pstate->parentParseState;
+               else    break;
        }
        return rte_result;
 }
@@ -152,11 +181,15 @@ addRangeTableEntry(ParseState *pstate,
 {
        Relation        relation;
        RangeTblEntry *rte = makeNode(RangeTblEntry);
+       int     sublevels_up;
 
-       if (pstate != NULL &&
-               refnameRangeTableEntry(pstate->p_rtable, refname) != NULL)
-               elog(ERROR, "Table name %s specified more than once", refname);
-
+       if (pstate != NULL)
+       {
+               if (refnameRangeTablePosn(pstate, refname, &sublevels_up) != 0 &&
+                  (!inFromCl || sublevels_up == 0))
+                       elog(ERROR, "Table name %s specified more than once", refname);
+       }
+       
        rte->relname = pstrdup(relname);
        rte->refname = pstrdup(refname);
 
@@ -191,7 +224,6 @@ addRangeTableEntry(ParseState *pstate,
 /*
  * expandAll -
  *       makes a list of attributes
- *       assumes reldesc caching works
  */
 List      *
 expandAll(ParseState *pstate, char *relname, char *refname, int *this_resno)
@@ -206,7 +238,7 @@ expandAll(ParseState *pstate, char *relname, char *refname, int *this_resno)
        int                     type_len;
        RangeTblEntry *rte;
 
-       rte = refnameRangeTableEntry(pstate->p_rtable, refname);
+       rte = refnameRangeTableEntry(pstate, refname);
        if (rte == NULL)
                rte = addRangeTableEntry(pstate, relname, refname, FALSE, FALSE);
 
@@ -225,7 +257,8 @@ expandAll(ParseState *pstate, char *relname, char *refname, int *this_resno)
                TargetEntry *te = makeNode(TargetEntry);
 
                attrname = pstrdup((rdesc->rd_att->attrs[varattno]->attname).data);
-               varnode = (Var *) make_var(pstate, refname, attrname, &type_id);
+               varnode = (Var *) make_var(pstate, rte->relid, refname,
+                                                                                                       attrname, &type_id);
                type_len = (int) typeLen(typeidType(type_id));
 
                handleTargetColname(pstate, &resname, refname, attrname);
@@ -381,7 +414,7 @@ checkTargetTypes(ParseState *pstate, char *target_colname,
                return;
 
        if (refname != NULL)
-               rte = refnameRangeTableEntry(pstate->p_rtable, refname);
+               rte = refnameRangeTableEntry(pstate, refname);
        else
        {
                rte = colnameRangeTableEntry(pstate, colname);
index 57583f6773be441a923c242514c5fe3f8226ea30..6345b6002496037b3fefa7cdae88cd17b29ecdcc 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: makefuncs.h,v 1.5 1997/09/08 02:37:15 momjian Exp $
+ * $Id: makefuncs.h,v 1.6 1998/01/20 22:12:13 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -27,6 +27,7 @@ extern Var *
 makeVar(Index varno,
                AttrNumber varattno,
                Oid vartype,
+               Index varlevelsup,
                Index varnoold,
                AttrNumber varoattno);
 
index 92c2ab00f399adc79811f8df07033d89de59a429..af370b893c705debe594334dd98af7553967ce85 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: primnodes.h,v 1.15 1998/01/19 18:11:10 momjian Exp $
+ * $Id: primnodes.h,v 1.16 1998/01/20 22:12:14 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -104,6 +104,7 @@ typedef struct Expr
  *                                               (could be INNER or OUTER)
  *             varattno                - attribute number of this var, or zero for all
  *             vartype                 - pg_type tuple oid for the type of this var
+ *             varlevelsup             - for subquery variables referencing outer relations
  *             varnoold                - keep varno around in case it got changed to INNER/
  *                                               OUTER (see match_varid)
  *             varoattno               - attribute number of this var
@@ -122,6 +123,7 @@ typedef struct Var
        Index           varno;
        AttrNumber      varattno;
        Oid                     vartype;
+       Index           varlevelsup;    /* erased by upper optimizer */
        Index           varnoold;               /* only used by optimizer */
        AttrNumber      varoattno;              /* only used by optimizer */
 } Var;
index f09c7d0f86e50688bad3b0cd09687683d8cd92da..50580f103661d6df33eff7ebd005395b3e03f86a 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: parse_node.h,v 1.6 1998/01/19 05:06:41 momjian Exp $
+ * $Id: parse_node.h,v 1.7 1998/01/20 22:12:16 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -45,7 +45,8 @@ typedef struct ParseState
 
 extern ParseState *make_parsestate(ParseState *parentParseState);
 extern Expr *make_op(char *opname, Node *ltree, Node *rtree);
-extern Var *make_var(ParseState *pstate, char *refname, char *attrname, Oid *type_id);
+extern Var *make_var(ParseState *pstate, Oid relid, char *refname,
+                                                                               char *attrname, Oid *type_id);
 extern ArrayRef   *make_array_ref(Node *expr,
                           List *indirection);
 extern ArrayRef   *make_array_set(Expr *target_expr,
index eab72589ff57de996303c2fb90a9cf5296badc69..506fdad46b7c5214e1c408965396033f839f9c0d 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: parse_relation.h,v 1.5 1998/01/20 05:04:56 momjian Exp $
+ * $Id: parse_relation.h,v 1.6 1998/01/20 22:12:17 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -20,8 +20,9 @@
 #include <parser/parse_node.h>
 #include <utils/rel.h>
 
-extern RangeTblEntry *refnameRangeTableEntry(List *rtable, char *refname);
-extern int refnameRangeTablePosn(List *rtable, char *refname);
+extern RangeTblEntry *refnameRangeTableEntry(ParseState *pstate, char *refname);
+extern int refnameRangeTablePosn(ParseState *pstate,
+                                                                               char *refname, int *sublevels_up);
 extern RangeTblEntry *colnameRangeTableEntry(ParseState *pstate, char *colname);
 extern RangeTblEntry *addRangeTableEntry(ParseState *pstate,
                                                                   char *relname,