aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_func.c
diff options
context:
space:
mode:
authorThomas G. Lockhart <lockhart@fourpalms.org>2000-02-15 03:38:29 +0000
committerThomas G. Lockhart <lockhart@fourpalms.org>2000-02-15 03:38:29 +0000
commita344a6e7b5d7b2b87f33a155c3ef88bdfdce3fd8 (patch)
tree78c19baad416cfe014237bc726baff63aff2b150 /src/backend/parser/parse_func.c
parent92c8437d8de8efeb5324fcccb0175beec8e66619 (diff)
downloadpostgresql-a344a6e7b5d7b2b87f33a155c3ef88bdfdce3fd8.tar.gz
postgresql-a344a6e7b5d7b2b87f33a155c3ef88bdfdce3fd8.zip
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/parser/parse_func.c')
-rw-r--r--src/backend/parser/parse_func.c58
1 files changed, 52 insertions, 6 deletions
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c
index 96863179447..06afc867903 100644
--- a/src/backend/parser/parse_func.c
+++ b/src/backend/parser/parse_func.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.68 2000/01/26 05:56:42 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.69 2000/02/15 03:37:47 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -283,6 +283,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
if (IsA(first_arg, Ident) && ((Ident *) first_arg)->isRel)
{
RangeTblEntry *rte;
+ AttrNumber attnum;
Ident *ident = (Ident *) first_arg;
/*
@@ -293,7 +294,8 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
rte = refnameRangeTableEntry(pstate, refname);
if (rte == NULL)
{
- rte = addRangeTableEntry(pstate, refname, refname,
+ rte = addRangeTableEntry(pstate, refname,
+ makeAttr(refname, NULL),
FALSE, FALSE, TRUE);
#ifdef WARN_FROM
elog(NOTICE,"Adding missing FROM-clause entry%s for table %s",
@@ -304,12 +306,53 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
relname = rte->relname;
relid = rte->relid;
+ attnum = InvalidAttrNumber;
/*
* If the attr isn't a set, just make a var for it. If it is
* a set, treat it like a function and drop through.
+ * Look through the explicit column list first, since we
+ * now allow column aliases.
+ * - thomas 2000-02-07
*/
- if (get_attnum(relid, funcname) != InvalidAttrNumber)
+ if (rte->ref->attrs != NULL)
+ {
+ List *c;
+ /* start counting attributes/columns from one.
+ * zero is reserved for InvalidAttrNumber.
+ * - thomas 2000-01-27
+ */
+ int i = 1;
+ foreach (c, rte->ref->attrs)
+ {
+ char *colname = strVal(lfirst(c));
+ /* found a match? */
+ if (strcmp(colname, funcname) == 0)
+ {
+ char *basename = get_attname(relid, i);
+
+ if (basename != NULL)
+ {
+ funcname = basename;
+ attnum = i;
+ }
+ /* attnum was initialized to InvalidAttrNumber
+ * earlier, so no need to reset it if the
+ * above test fails. - thomas 2000-02-07
+ */
+ break;
+ }
+ i++;
+ }
+ if (attnum == InvalidAttrNumber)
+ attnum = specialAttNum(funcname);
+ }
+ else
+ {
+ attnum = get_attnum(relid, funcname);
+ }
+
+ if (attnum != InvalidAttrNumber)
{
return (Node *) make_var(pstate,
relid,
@@ -474,7 +517,8 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
rte = refnameRangeTableEntry(pstate, refname);
if (rte == NULL)
{
- rte = addRangeTableEntry(pstate, refname, refname,
+ rte = addRangeTableEntry(pstate, refname,
+ makeAttr(refname, NULL),
FALSE, FALSE, TRUE);
#ifdef WARN_FROM
elog(NOTICE,"Adding missing FROM-clause entry%s for table %s",
@@ -485,7 +529,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
relname = rte->relname;
- vnum = refnameRangeTablePosn(pstate, rte->refname, NULL);
+ vnum = refnameRangeTablePosn(pstate, rte->ref->relname, NULL);
/*
* for func(relname), the param to the function is the tuple
@@ -593,7 +637,9 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
if (attisset)
{
if (!strcmp(funcname, "*"))
- funcnode->func_tlist = expandAll(pstate, relname, refname, curr_resno);
+ funcnode->func_tlist = expandAll(pstate, relname,
+ makeAttr(refname, NULL),
+ curr_resno);
else
{
funcnode->func_tlist = setup_tlist(funcname, argrelid);