diff options
author | Thomas G. Lockhart <lockhart@fourpalms.org> | 2000-02-15 03:38:29 +0000 |
---|---|---|
committer | Thomas G. Lockhart <lockhart@fourpalms.org> | 2000-02-15 03:38:29 +0000 |
commit | a344a6e7b5d7b2b87f33a155c3ef88bdfdce3fd8 (patch) | |
tree | 78c19baad416cfe014237bc726baff63aff2b150 /src/backend/parser/parse_func.c | |
parent | 92c8437d8de8efeb5324fcccb0175beec8e66619 (diff) | |
download | postgresql-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.c | 58 |
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); |