diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-04-11 20:00:18 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-04-11 20:00:18 +0000 |
commit | 902a6a0a4bc62d619a5ccd1ef0ff7fb3a5d897f1 (patch) | |
tree | c5cc85818d8a3ffae03a23bacd3e679945a41dbd /src/backend/utils/adt/ruleutils.c | |
parent | 3f6299df6c7d905bdef44eb3a4b19f248ebc14dc (diff) | |
download | postgresql-902a6a0a4bc62d619a5ccd1ef0ff7fb3a5d897f1.tar.gz postgresql-902a6a0a4bc62d619a5ccd1ef0ff7fb3a5d897f1.zip |
Restructure representation of aggregate functions so that they have pg_proc
entries, per pghackers discussion. This fixes aggregates to live in
namespaces, and also simplifies/speeds up lookup in parse_func.c.
Also, add a 'proimplicit' flag to pg_proc that controls whether a type
coercion function may be invoked implicitly, or only explicitly. The
current settings of these flags are more permissive than I would like,
but we will need to debate and refine the behavior; for now, I avoided
breaking regression tests as much as I could.
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 55 |
1 files changed, 42 insertions, 13 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index d8340234397..501d5a2095f 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -3,7 +3,7 @@ * back to source text * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.95 2002/03/22 02:56:35 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.96 2002/04/11 20:00:04 tgl Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -130,6 +130,7 @@ static void get_names_for_var(Var *var, deparse_context *context, char **refname, char **attname); static void get_rule_expr(Node *node, deparse_context *context); static void get_func_expr(Expr *expr, deparse_context *context); +static void get_agg_expr(Aggref *aggref, deparse_context *context); static Node *strip_type_coercion(Node *expr, Oid resultType); static void get_tle_expr(TargetEntry *tle, deparse_context *context); static void get_const_expr(Const *constval, deparse_context *context); @@ -1694,18 +1695,7 @@ get_rule_expr(Node *node, deparse_context *context) break; case T_Aggref: - { - Aggref *aggref = (Aggref *) node; - - appendStringInfo(buf, "%s(%s", - quote_identifier(aggref->aggname), - aggref->aggdistinct ? "DISTINCT " : ""); - if (aggref->aggstar) - appendStringInfo(buf, "*"); - else - get_rule_expr(aggref->target, context); - appendStringInfoChar(buf, ')'); - } + get_agg_expr((Aggref *) node, context); break; case T_Iter: @@ -2000,6 +1990,45 @@ get_func_expr(Expr *expr, deparse_context *context) ReleaseSysCache(proctup); } +/* ---------- + * get_agg_expr - Parse back an Aggref node + * ---------- + */ +static void +get_agg_expr(Aggref *aggref, deparse_context *context) +{ + StringInfo buf = context->buf; + HeapTuple proctup; + Form_pg_proc procStruct; + char *proname; + + /* + * Get the aggregate's pg_proc tuple + */ + proctup = SearchSysCache(PROCOID, + ObjectIdGetDatum(aggref->aggfnoid), + 0, 0, 0); + if (!HeapTupleIsValid(proctup)) + elog(ERROR, "cache lookup for proc %u failed", aggref->aggfnoid); + + procStruct = (Form_pg_proc) GETSTRUCT(proctup); + proname = NameStr(procStruct->proname); + + /* + * Display it + */ + appendStringInfo(buf, "%s(%s", + quote_identifier(proname), + aggref->aggdistinct ? "DISTINCT " : ""); + if (aggref->aggstar) + appendStringInfo(buf, "*"); + else + get_rule_expr(aggref->target, context); + appendStringInfoChar(buf, ')'); + + ReleaseSysCache(proctup); +} + /* * strip_type_coercion |