summaryrefslogtreecommitdiff
path: root/src/backend/nodes
diff options
context:
space:
mode:
authorThomas G. Lockhart2000-02-15 03:38:29 +0000
committerThomas G. Lockhart2000-02-15 03:38:29 +0000
commita344a6e7b5d7b2b87f33a155c3ef88bdfdce3fd8 (patch)
tree78c19baad416cfe014237bc726baff63aff2b150 /src/backend/nodes
parent92c8437d8de8efeb5324fcccb0175beec8e66619 (diff)
Carry column aliases from the parser frontend. Enables queries like
SELECT a FROM t1 tx (a); Allow join syntax, including queries like SELECT * FROM t1 NATURAL JOIN t2; Update RTE structure to hold column aliases in an Attr structure.
Diffstat (limited to 'src/backend/nodes')
-rw-r--r--src/backend/nodes/copyfuncs.c21
-rw-r--r--src/backend/nodes/equalfuncs.c22
-rw-r--r--src/backend/nodes/freefuncs.c27
-rw-r--r--src/backend/nodes/makefuncs.c25
-rw-r--r--src/backend/nodes/outfuncs.c20
-rw-r--r--src/backend/nodes/print.c9
-rw-r--r--src/backend/nodes/readfuncs.c65
7 files changed, 153 insertions, 36 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index c5c9cb0782e..adf0c7f1987 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.104 2000/02/07 04:40:56 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.105 2000/02/15 03:37:08 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -688,6 +688,18 @@ _copyVar(Var *from)
return newnode;
}
+static Attr *
+_copyAttr(Attr *from)
+{
+ Attr *newnode = makeNode(Attr);
+
+ if (from->relname)
+ newnode->relname = pstrdup(from->relname);
+ Node_Copy(from, newnode, attrs);
+
+ return newnode;
+}
+
/* ----------------
* _copyOper
* ----------------
@@ -1327,8 +1339,8 @@ _copyRangeTblEntry(RangeTblEntry *from)
if (from->relname)
newnode->relname = pstrdup(from->relname);
- if (from->refname)
- newnode->refname = pstrdup(from->refname);
+ if (from->ref)
+ Node_Copy(from, newnode, ref);
newnode->relid = from->relid;
newnode->inh = from->inh;
newnode->inFromCl = from->inFromCl;
@@ -1571,6 +1583,9 @@ copyObject(void *from)
case T_Var:
retval = _copyVar(from);
break;
+ case T_Attr:
+ retval = _copyAttr(from);
+ break;
case T_Oper:
retval = _copyOper(from);
break;
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 5888f49515e..3ddc8d6c98a 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.59 2000/02/07 04:40:57 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.60 2000/02/15 03:37:08 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -96,6 +96,17 @@ _equalExpr(Expr *a, Expr *b)
}
static bool
+_equalAttr(Attr *a, Attr *b)
+{
+ if (!strcmp(a->relname, b->relname))
+ return false;
+ if (length(a->attrs) != length(b->attrs))
+ return false;
+
+ return equal(a->attrs, b->attrs);
+}
+
+static bool
_equalVar(Var *a, Var *b)
{
if (a->varno != b->varno)
@@ -633,14 +644,14 @@ _equalRangeTblEntry(RangeTblEntry *a, RangeTblEntry *b)
if (a->relname != b->relname)
return false;
}
- if (a->refname && b->refname)
+ if (a->ref && b->ref)
{
- if (strcmp(a->refname, b->refname) != 0)
+ if (! equal(a->ref, b->ref))
return false;
}
else
{
- if (a->refname != b->refname)
+ if (a->ref != b->ref)
return false;
}
if (a->relid != b->relid)
@@ -845,6 +856,9 @@ equal(void *a, void *b)
case T_EState:
retval = _equalEState(a, b);
break;
+ case T_Attr:
+ retval = _equalAttr(a, b);
+ break;
case T_Integer:
case T_String:
case T_Float:
diff --git a/src/backend/nodes/freefuncs.c b/src/backend/nodes/freefuncs.c
index ab308fe3101..690da02de85 100644
--- a/src/backend/nodes/freefuncs.c
+++ b/src/backend/nodes/freefuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.34 2000/02/07 04:40:57 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.35 2000/02/15 03:37:08 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1013,8 +1013,19 @@ _freeRangeTblEntry(RangeTblEntry *node)
{
if (node->relname)
pfree(node->relname);
- if (node->refname)
- pfree(node->refname);
+ if (node->ref)
+ freeObject(node->ref);
+
+ pfree(node);
+}
+
+static void
+_freeAttr(Attr *node)
+{
+ if (node->relname)
+ pfree(node->relname);
+ if (node->attrs)
+ freeObject(node->attrs);
pfree(node);
}
@@ -1308,6 +1319,9 @@ freeObject(void *node)
case T_TypeCast:
_freeTypeCast(node);
break;
+ case T_Attr:
+ _freeAttr(node);
+ break;
/*
* VALUE NODES
@@ -1332,3 +1346,10 @@ freeObject(void *node)
break;
}
}
+
+
+
+
+
+
+
diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c
index 221a83d713e..e42930ef87b 100644
--- a/src/backend/nodes/makefuncs.c
+++ b/src/backend/nodes/makefuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/makefuncs.c,v 1.19 2000/01/26 05:56:31 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/makefuncs.c,v 1.20 2000/02/15 03:37:09 thomas Exp $
*
* NOTES
* Creator functions in POSTGRES 4.2 are generated automatically. Most of
@@ -141,3 +141,26 @@ makeConst(Oid consttype,
cnst->constiscast = constiscast;
return cnst;
}
+
+/*
+ * makeAttr -
+ * creates an Attr node
+ */
+Attr *
+makeAttr(char *relname, char *attname)
+{
+ Attr *a = makeNode(Attr);
+
+ a->relname = pstrdup(relname);
+ a->paramNo = NULL;
+ if (attname != NULL)
+ a->attrs = lcons(makeString(pstrdup(attname)), NIL);
+ a->indirection = NULL;
+
+ return a;
+}
+
+
+
+
+
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 8923510e1b4..e4c35cc277f 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.106 2000/02/07 04:40:57 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.107 2000/02/15 03:37:09 thomas Exp $
*
* NOTES
* Every (plan) node in POSTGRES has an associated "out" routine which
@@ -954,8 +954,8 @@ _outRangeTblEntry(StringInfo str, RangeTblEntry *node)
{
appendStringInfo(str, " RTE :relname ");
_outToken(str, node->relname);
- appendStringInfo(str, " :refname ");
- _outToken(str, node->refname);
+ appendStringInfo(str, " :ref ");
+ _outNode(str, node->ref);
appendStringInfo(str,
" :relid %u :inh %s :inFromCl %s :inJoinSet %s :skipAcl %s",
node->relid,
@@ -1273,18 +1273,10 @@ _outIdent(StringInfo str, Ident *node)
static void
_outAttr(StringInfo str, Attr *node)
{
- List *l;
-
- appendStringInfo(str, " ATTR ");
+ appendStringInfo(str, " ATTR :relname ");
_outToken(str, node->relname);
- appendStringInfo(str, " (");
- foreach(l, node->attrs)
- {
- _outNode(str, lfirst(l));
- if (lnext(l))
- appendStringInfo(str, " ");
- }
- appendStringInfo(str, ")");
+ appendStringInfo(str, " :attrs ");
+ _outNode(str, node->attrs);
}
static void
diff --git a/src/backend/nodes/print.c b/src/backend/nodes/print.c
index ffba95949ad..a84b829950f 100644
--- a/src/backend/nodes/print.c
+++ b/src/backend/nodes/print.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.35 2000/01/26 05:56:32 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.36 2000/02/15 03:37:09 thomas Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -133,7 +133,7 @@ print_rt(List *rtable)
RangeTblEntry *rte = lfirst(l);
printf("%d\t%s(%s)\t%u\t%d\t%s\n",
- i, rte->relname, rte->refname, rte->relid,
+ i, rte->relname, rte->ref->relname, rte->relid,
rte->inFromCl,
(rte->inh ? "inh" : ""));
i++;
@@ -175,8 +175,9 @@ print_expr(Node *expr, List *rtable)
{
rt = rt_fetch(var->varno, rtable);
relname = rt->relname;
- if (rt->refname)
- relname = rt->refname; /* table renamed */
+ if (rt->ref)
+ if (rt->ref->relname)
+ relname = rt->relname; /* table renamed */
attname = get_attname(rt->relid, var->varattno);
}
break;
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 38db7def0b1..7d56b603b85 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.82 2000/02/07 04:40:57 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.83 2000/02/15 03:37:09 thomas Exp $
*
* NOTES
* Most of the read functions for plan nodes are tested. (In fact, they
@@ -1322,6 +1322,51 @@ _readTargetEntry()
return local_node;
}
+static List *
+_readList()
+{
+ List *local_node = NULL;
+ char *token;
+ int length;
+
+ token = lsptok(NULL, &length); /* eat "(" */
+ token = lsptok(NULL, &length); /* get "{" */
+ while (strncmp(token, "{", length) == 0)
+ {
+ nconc(local_node, nodeRead(true));
+
+ token = lsptok(NULL, &length); /* eat ")" */
+ if (strncmp(token, "}", length) != 0)
+ elog(ERROR, "badly formatted attribute list"
+ " in planstring \"%.10s\"...\n", token);
+ token = lsptok(NULL, &length); /* "{" or ")" */
+ }
+
+ return local_node;
+}
+
+static Attr *
+_readAttr()
+{
+ Attr *local_node;
+ char *token;
+ int length;
+
+ local_node = makeNode(Attr);
+
+ token = lsptok(NULL, &length); /* eat :relname */
+ token = lsptok(NULL, &length); /* get relname */
+ if (length == 0)
+ local_node->relname = pstrdup("");
+ else
+ local_node->relname = debackslash(token, length);
+
+ token = lsptok(NULL, &length); /* eat :attrs */
+ local_node->attrs = _readList();
+
+ return local_node;
+}
+
/* ----------------
* _readRangeTblEntry
* ----------------
@@ -1342,12 +1387,8 @@ _readRangeTblEntry()
else
local_node->relname = debackslash(token, length);
- token = lsptok(NULL, &length); /* eat :refname */
- token = lsptok(NULL, &length); /* get :refname */
- if (length == 0)
- local_node->refname = NULL;
- else
- local_node->refname = debackslash(token, length);
+ token = lsptok(NULL, &length); /* eat :ref */
+ local_node->ref = nodeRead(true);
token = lsptok(NULL, &length); /* eat :relid */
token = lsptok(NULL, &length); /* get :relid */
@@ -1795,6 +1836,8 @@ parsePlanString(void)
return_value = _readArray();
else if (length == 3 && strncmp(token, "VAR", length) == 0)
return_value = _readVar();
+ else if (length == 4 && strncmp(token, "ATTR", length) == 0)
+ return_value = _readAttr();
else if (length == 5 && strncmp(token, "CONST", length) == 0)
return_value = _readConst();
else if (length == 4 && strncmp(token, "FUNC", length) == 0)
@@ -1843,6 +1886,14 @@ parsePlanString(void)
return_value = _readCaseWhen();
else if (length == 7 && strncmp(token, "ROWMARK", length) == 0)
return_value = _readRowMark();
+#if 0
+ else if (length == 1 && strncmp(token, "{", length) == 0)
+ {
+ /* raw list (of strings?) found in Attr structure - thomas 2000-02-09 */
+ return_value = nodeRead(true);
+ token = lsptok(NULL, &length); /* eat trailing brace */
+ }
+#endif
else
elog(ERROR, "badly formatted planstring \"%.10s\"...\n", token);