New comment. This func/column things has always confused me.

/*
 *  parse function
 *  This code is confusing because the database can accept
 *  relation.column, column.function, or relation.column.function.
 *  In these cases, funcname is the last parameter, and fargs are
 *  the rest.
 *
 *  It can also be called as func(col) or func(col,col).
 *  In this case, Funcname is the part before parens, and fargs
 *  are the part in parens.
 *
 */
Node *
ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
                  bool agg_star, bool agg_distinct,
                  int precedence)
This commit is contained in:
Bruce Momjian 2001-05-19 00:33:20 +00:00
parent f61d70c2ac
commit 5ec8474323
3 changed files with 20 additions and 16 deletions

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.94 2001/05/18 22:35:50 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.95 2001/05/19 00:33:20 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -173,7 +173,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
a->lexpr,
precedence);
result = ParseColumnOrFunc(pstate,
result = ParseFuncOrColumn(pstate,
"nullvalue",
makeList1(lexpr),
false, false,
@ -186,7 +186,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
a->lexpr,
precedence);
result = ParseColumnOrFunc(pstate,
result = ParseFuncOrColumn(pstate,
"nonnullvalue",
makeList1(lexpr),
false, false,
@ -273,7 +273,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
lfirst(args) = transformExpr(pstate,
(Node *) lfirst(args),
precedence);
result = ParseColumnOrFunc(pstate,
result = ParseFuncOrColumn(pstate,
fn->funcname,
fn->args,
fn->agg_star,

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.105 2001/05/18 22:54:23 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.106 2001/05/19 00:33:20 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -75,7 +75,7 @@ ParseNestedFuncOrColumn(ParseState *pstate, Attr *attr, int precedence)
(Node *) attr->paramNo,
EXPR_RELATION_FIRST);
retval = ParseColumnOrFunc(pstate, strVal(lfirst(attr->attrs)),
retval = ParseFuncOrColumn(pstate, strVal(lfirst(attr->attrs)),
makeList1(param),
false, false,
precedence);
@ -86,7 +86,7 @@ ParseNestedFuncOrColumn(ParseState *pstate, Attr *attr, int precedence)
ident->name = attr->relname;
ident->isRel = TRUE;
retval = ParseColumnOrFunc(pstate, strVal(lfirst(attr->attrs)),
retval = ParseFuncOrColumn(pstate, strVal(lfirst(attr->attrs)),
makeList1(ident),
false, false,
precedence);
@ -95,7 +95,7 @@ ParseNestedFuncOrColumn(ParseState *pstate, Attr *attr, int precedence)
/* Do more attributes follow this one? */
foreach(mutator_iter, lnext(attr->attrs))
{
retval = ParseColumnOrFunc(pstate, strVal(lfirst(mutator_iter)),
retval = ParseFuncOrColumn(pstate, strVal(lfirst(mutator_iter)),
makeList1(retval),
false, false,
precedence);
@ -236,14 +236,18 @@ agg_select_candidate(Oid typeid, CandidateList candidates)
/*
* parse function
* This code is confusing code because the database can accept
* This code is confusing because the database can accept
* relation.column, column.function, or relation.column.function.
* It can also be called as func(col) or func(col,col).
* In these cases, funcname is the last parameter, and fargs are
* the rest.
*
* It can also be called as func(col) or func(col,col).
* In this case, Funcname is the part before parens, and fargs
* are the part in parens.
*
* Funcname is the first parameter, and fargs are the rest.
*/
Node *
ParseColumnOrFunc(ParseState *pstate, char *funcname, List *fargs,
ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
bool agg_star, bool agg_distinct,
int precedence)
{
@ -491,7 +495,7 @@ ParseColumnOrFunc(ParseState *pstate, char *funcname, List *fargs,
}
else
{
elog(ERROR, "ParseColumnOrFunc: unexpected node type %d",
elog(ERROR, "ParseFuncOrColumn: unexpected node type %d",
nodeTag(rteorjoin));
rte = NULL; /* keep compiler quiet */
}
@ -1540,7 +1544,7 @@ make_arguments(ParseState *pstate,
/*
** setup_field_select
** Build a FieldSelect node that says which attribute to project to.
** This routine is called by ParseColumnOrFunc() when we have found
** This routine is called by ParseFuncOrColumn() when we have found
** a projection on a function result or parameter.
*/
static FieldSelect *

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: parse_func.h,v 1.30 2001/05/18 22:35:51 momjian Exp $
* $Id: parse_func.h,v 1.31 2001/05/19 00:33:20 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -40,7 +40,7 @@ typedef struct _CandidateList
extern Node *ParseNestedFuncOrColumn(ParseState *pstate, Attr *attr,
int precedence);
extern Node *ParseColumnOrFunc(ParseState *pstate,
extern Node *ParseFuncOrColumn(ParseState *pstate,
char *funcname, List *fargs,
bool agg_star, bool agg_distinct,
int precedence);