mirror of
https://github.com/postgres/postgres.git
synced 2025-07-26 01:22:12 +03:00
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.
This commit is contained in:
@ -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;
|
||||
|
@ -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 $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -95,6 +95,17 @@ _equalExpr(Expr *a, Expr *b)
|
||||
return true;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user