diff options
| author | Thomas G. Lockhart | 2000-02-15 03:38:29 +0000 |
|---|---|---|
| committer | Thomas G. Lockhart | 2000-02-15 03:38:29 +0000 |
| commit | a344a6e7b5d7b2b87f33a155c3ef88bdfdce3fd8 (patch) | |
| tree | 78c19baad416cfe014237bc726baff63aff2b150 /src/backend/nodes | |
| parent | 92c8437d8de8efeb5324fcccb0175beec8e66619 (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.c | 21 | ||||
| -rw-r--r-- | src/backend/nodes/equalfuncs.c | 22 | ||||
| -rw-r--r-- | src/backend/nodes/freefuncs.c | 27 | ||||
| -rw-r--r-- | src/backend/nodes/makefuncs.c | 25 | ||||
| -rw-r--r-- | src/backend/nodes/outfuncs.c | 20 | ||||
| -rw-r--r-- | src/backend/nodes/print.c | 9 | ||||
| -rw-r--r-- | src/backend/nodes/readfuncs.c | 65 |
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); |
