aboutsummaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2001-02-14 21:35:07 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2001-02-14 21:35:07 +0000
commit4a66f9dd54694eb4d7ecce2c7e0f0c50dfde88cd (patch)
tree8810441569d5cf2e29f2a5c2b67ceb91d74deb2d /src/include
parentd42d31e78e2f9db73edb0b0ed35cafb1c409bdbf (diff)
downloadpostgresql-4a66f9dd54694eb4d7ecce2c7e0f0c50dfde88cd.tar.gz
postgresql-4a66f9dd54694eb4d7ecce2c7e0f0c50dfde88cd.zip
Change scoping of table and join refnames to conform to SQL92: a JOIN
clause with an alias is a <subquery> and therefore hides table references appearing within it, according to the spec. This is the same as the preliminary patch I posted to pgsql-patches yesterday, plus some really grotty code in ruleutils.c to reverse-list a query tree with the correct alias name depending on context. I'd rather not have done that, but unless we want to force another initdb for 7.1, there's no other way for now.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/nodes/primnodes.h23
-rw-r--r--src/include/parser/parse_clause.h9
-rw-r--r--src/include/parser/parse_node.h18
-rw-r--r--src/include/parser/parse_relation.h13
-rw-r--r--src/include/utils/builtins.h5
5 files changed, 42 insertions, 26 deletions
diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h
index 2ca40e8ceca..f5cd6ea461d 100644
--- a/src/include/nodes/primnodes.h
+++ b/src/include/nodes/primnodes.h
@@ -10,7 +10,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: primnodes.h,v 1.51 2001/01/24 19:43:26 momjian Exp $
+ * $Id: primnodes.h,v 1.52 2001/02/14 21:35:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -29,7 +29,7 @@ typedef struct FunctionCache *FunctionCachePtr;
* ----------------------------------------------------------------
*/
-/*
+/*--------------------
* Resdom (Result Domain)
*
* Notes:
@@ -50,7 +50,7 @@ typedef struct FunctionCache *FunctionCachePtr;
*
* Both reskey and reskeyop are typically zero during parse/plan stages.
* The executor does not pay any attention to ressortgroupref.
- *
+ *--------------------
*/
typedef struct Resdom
{
@@ -129,7 +129,6 @@ typedef struct Expr
* list. But varnoold/varoattno continue to hold the original values.
* The code doesn't really need varnoold/varoattno, but they are very useful
* for debugging and interpreting completed plans, so we keep them around.
- * ----------------
*/
#define INNER 65000
#define OUTER 65001
@@ -153,7 +152,7 @@ typedef struct Var
AttrNumber varoattno; /* original value of varattno */
} Var;
-/*
+/*--------------------
* Oper
*
* NOTE: in the good old days 'opno' used to be both (or either, or
@@ -169,7 +168,7 @@ typedef struct Var
* Note also that opid is not necessarily filled in immediately on creation
* of the node. The planner makes sure it is valid before passing the node
* tree to the executor, but during parsing/planning opid is typically 0.
- *
+ *--------------------
*/
typedef struct Oper
{
@@ -499,10 +498,14 @@ typedef struct RangeTblRef
* are not equivalent to ON() since they also affect the output column list.
*
* alias is an Attr node representing the AS alias-clause attached to the
- * join expression, or NULL if no clause. During parse analysis, colnames
- * is filled with a list of String nodes giving the column names (real or
- * alias) of the output of the join, and colvars is filled with a list of
- * expressions that can be copied to reference the output columns.
+ * join expression, or NULL if no clause. NB: presence or absence of the
+ * alias has a critical impact on semantics, because a join with an alias
+ * restricts visibility of the tables/columns inside it.
+ *
+ * During parse analysis, colnames is filled with a list of String nodes
+ * giving the column names (real or alias) of the output of the join,
+ * and colvars is filled with a list of expressions that can be copied to
+ * reference the output columns.
*----------
*/
typedef struct JoinExpr
diff --git a/src/include/parser/parse_clause.h b/src/include/parser/parse_clause.h
index 8f760ca38b3..31d5542efc2 100644
--- a/src/include/parser/parse_clause.h
+++ b/src/include/parser/parse_clause.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: parse_clause.h,v 1.22 2001/01/24 19:43:27 momjian Exp $
+ * $Id: parse_clause.h,v 1.23 2001/02/14 21:35:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -16,10 +16,9 @@
#include "parser/parse_node.h"
-extern void makeRangeTable(ParseState *pstate, List *frmList);
-extern void lockTargetTable(ParseState *pstate, char *relname);
-extern void setTargetTable(ParseState *pstate, char *relname,
- bool inh, bool inJoinSet);
+extern void transformFromClause(ParseState *pstate, List *frmList);
+extern int setTargetTable(ParseState *pstate, char *relname,
+ bool inh, bool alsoSource);
extern bool interpretInhOption(InhOption inhOpt);
extern Node *transformWhereClause(ParseState *pstate, Node *where);
extern List *transformGroupClause(ParseState *pstate, List *grouplist,
diff --git a/src/include/parser/parse_node.h b/src/include/parser/parse_node.h
index d8fcd6ee907..bb0229abcd1 100644
--- a/src/include/parser/parse_node.h
+++ b/src/include/parser/parse_node.h
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: parse_node.h,v 1.24 2001/01/24 19:43:27 momjian Exp $
+ * $Id: parse_node.h,v 1.25 2001/02/14 21:35:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -18,6 +18,20 @@
/*
* State information used during parse analysis
+ *
+ * p_rtable: list of RTEs that will become the rangetable of the query.
+ * Note that neither relname nor refname of these entries are necessarily
+ * unique; searching the rtable by name is a bad idea.
+ *
+ * p_joinlist: list of join items (RangeTblRef and JoinExpr nodes) that
+ * will become the fromlist of the query's top-level FromExpr node.
+ *
+ * p_namespace: list of join items that represents the current namespace
+ * for table and column lookup. This may be just a subset of the rtable +
+ * joinlist, and/or may contain entries that are not yet added to the main
+ * joinlist. Note that an RTE that is present in p_namespace, but does not
+ * have its inFromCl flag set, is accessible only with an explicit qualifier;
+ * lookups of unqualified column names should ignore it.
*/
typedef struct ParseState
{
@@ -25,6 +39,7 @@ typedef struct ParseState
List *p_rtable; /* range table so far */
List *p_joinlist; /* join items so far (will become
* FromExpr node's fromlist) */
+ List *p_namespace; /* current lookup namespace (join items) */
int p_last_resno; /* last targetlist resno assigned */
List *p_forUpdate; /* FOR UPDATE clause, if any (see gram.y) */
bool p_hasAggs;
@@ -42,6 +57,7 @@ extern Node *make_operand(char *opname, Node *tree,
extern Var *make_var(ParseState *pstate, RangeTblEntry *rte, int attrno);
extern ArrayRef *transformArraySubscripts(ParseState *pstate,
Node *arrayBase,
+ Oid arrayType,
List *indirection,
bool forceSlice,
Node *assignFrom);
diff --git a/src/include/parser/parse_relation.h b/src/include/parser/parse_relation.h
index bfdf7e8c2af..274de9e8895 100644
--- a/src/include/parser/parse_relation.h
+++ b/src/include/parser/parse_relation.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: parse_relation.h,v 1.21 2001/01/24 19:43:27 momjian Exp $
+ * $Id: parse_relation.h,v 1.22 2001/02/14 21:35:06 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -19,15 +19,11 @@
extern Node *refnameRangeOrJoinEntry(ParseState *pstate,
char *refname,
int *sublevels_up);
-extern RangeTblEntry *refnameRangeTableEntry(ParseState *pstate,
- char *refname);
-extern int refnameRangeTablePosn(ParseState *pstate,
- char *refname,
- int *sublevels_up);
+extern void checkNameSpaceConflicts(ParseState *pstate, Node *namespace1,
+ Node *namespace2);
extern int RTERangeTablePosn(ParseState *pstate,
RangeTblEntry *rte,
int *sublevels_up);
-extern JoinExpr *scanJoinListForRefname(Node *jtnode, char *refname);
extern Node *colnameToVar(ParseState *pstate, char *colname);
extern Node *qualifiedNameToVar(ParseState *pstate, char *refname,
char *colname, bool implicitRTEOK);
@@ -40,7 +36,8 @@ extern RangeTblEntry *addRangeTableEntryForSubquery(ParseState *pstate,
Query *subquery,
Attr *alias,
bool inFromCl);
-extern void addRTEtoJoinList(ParseState *pstate, RangeTblEntry *rte);
+extern void addRTEtoQuery(ParseState *pstate, RangeTblEntry *rte,
+ bool addToJoinList, bool addToNameSpace);
extern RangeTblEntry *addImplicitRTE(ParseState *pstate, char *relname);
extern void expandRTE(ParseState *pstate, RangeTblEntry *rte,
List **colnames, List **colvars);
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 28cb478189a..dcc923a36de 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: builtins.h,v 1.146 2001/01/24 19:43:28 momjian Exp $
+ * $Id: builtins.h,v 1.147 2001/02/14 21:35:06 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -325,8 +325,9 @@ extern Datum pg_get_ruledef(PG_FUNCTION_ARGS);
extern Datum pg_get_viewdef(PG_FUNCTION_ARGS);
extern Datum pg_get_indexdef(PG_FUNCTION_ARGS);
extern Datum pg_get_userbyid(PG_FUNCTION_ARGS);
-extern char *deparse_expression(Node *expr, List *rangetables,
+extern char *deparse_expression(Node *expr, List *dpcontext,
bool forceprefix);
+extern List *deparse_context_for(char *relname, Oid relid);
/* selfuncs.c */
extern Datum eqsel(PG_FUNCTION_ARGS);