summaryrefslogtreecommitdiff
path: root/src/bin
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-04-11 20:00:18 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-04-11 20:00:18 +0000
commit902a6a0a4bc62d619a5ccd1ef0ff7fb3a5d897f1 (patch)
treec5cc85818d8a3ffae03a23bacd3e679945a41dbd /src/bin
parent3f6299df6c7d905bdef44eb3a4b19f248ebc14dc (diff)
downloadpostgresql-902a6a0a4bc62d619a5ccd1ef0ff7fb3a5d897f1.tar.gz
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/bin')
-rw-r--r--src/bin/pg_dump/pg_dump.c40
-rw-r--r--src/bin/pg_dump/pg_dump.h3
-rw-r--r--src/bin/psql/describe.c30
-rw-r--r--src/bin/psql/tab-complete.c4
4 files changed, 54 insertions, 23 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 8ebc247dc2..0e54fd80d7 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -22,7 +22,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.246 2002/04/05 11:51:12 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.247 2002/04/11 20:00:06 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1873,7 +1873,7 @@ getAggregates(int *numAggs)
"(select usename from pg_user where aggowner = usesysid) as usename "
"from pg_aggregate");
}
- else
+ else if (g_fout->remoteVersion < 70300)
{
appendPQExpBuffer(query, "SELECT pg_aggregate.oid, aggname, aggtransfn, "
"aggfinalfn, aggtranstype, aggbasetype, "
@@ -1882,6 +1882,16 @@ getAggregates(int *numAggs)
"(select usename from pg_user where aggowner = usesysid) as usename "
"from pg_aggregate");
}
+ else
+ {
+ appendPQExpBuffer(query, "SELECT p.oid, proname as aggname, aggtransfn, "
+ "aggfinalfn, aggtranstype, proargtypes[0] as aggbasetype, "
+ "agginitval, "
+ "'t'::boolean as convertok, "
+ "(select usename from pg_user where proowner = usesysid) as usename "
+ "from pg_aggregate a, pg_proc p "
+ "where a.aggfnoid = p.oid");
+ }
res = PQexec(g_conn, query->data);
if (!res ||
@@ -1960,6 +1970,7 @@ getFuncs(int *numFuncs)
int i_prosrc;
int i_probin;
int i_provolatile;
+ int i_isimplicit;
int i_isstrict;
int i_usename;
@@ -1972,7 +1983,8 @@ getFuncs(int *numFuncs)
"proretset, proargtypes, prosrc, probin, "
"(select usename from pg_user where proowner = usesysid) as usename, "
"case when proiscachable then 'i' else 'v' end as provolatile, "
-"'f'::boolean as proisstrict "
+ "'f'::boolean as proimplicit, "
+ "'f'::boolean as proisstrict "
"from pg_proc "
"where pg_proc.oid > '%u'::oid",
g_last_builtin_oid);
@@ -1984,6 +1996,7 @@ getFuncs(int *numFuncs)
"proretset, proargtypes, prosrc, probin, "
"(select usename from pg_user where proowner = usesysid) as usename, "
"case when proiscachable then 'i' else 'v' end as provolatile, "
+ "'f'::boolean as proimplicit, "
"proisstrict "
"from pg_proc "
"where pg_proc.oid > '%u'::oid",
@@ -1995,9 +2008,9 @@ getFuncs(int *numFuncs)
"SELECT pg_proc.oid, proname, prolang, pronargs, prorettype, "
"proretset, proargtypes, prosrc, probin, "
"(select usename from pg_user where proowner = usesysid) as usename, "
- "provolatile, proisstrict "
+ "provolatile, proimplicit, proisstrict "
"from pg_proc "
- "where pg_proc.oid > '%u'::oid",
+ "where pg_proc.oid > '%u'::oid and not proisagg",
g_last_builtin_oid);
}
@@ -2028,6 +2041,7 @@ getFuncs(int *numFuncs)
i_prosrc = PQfnumber(res, "prosrc");
i_probin = PQfnumber(res, "probin");
i_provolatile = PQfnumber(res, "provolatile");
+ i_isimplicit = PQfnumber(res, "proimplicit");
i_isstrict = PQfnumber(res, "proisstrict");
i_usename = PQfnumber(res, "usename");
@@ -2045,6 +2059,7 @@ getFuncs(int *numFuncs)
finfo[i].lang = atooid(PQgetvalue(res, i, i_prolang));
finfo[i].usename = strdup(PQgetvalue(res, i, i_usename));
finfo[i].provolatile = (PQgetvalue(res, i, i_provolatile))[0];
+ finfo[i].isimplicit = (strcmp(PQgetvalue(res, i, i_isimplicit), "t") == 0);
finfo[i].isstrict = (strcmp(PQgetvalue(res, i, i_isstrict), "t") == 0);
if (strlen(finfo[i].usename) == 0)
@@ -3670,6 +3685,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i,
formatStringLiteral(q, func_lang, CONV_ALL);
if (finfo[i].provolatile != PROVOLATILE_VOLATILE ||
+ finfo[i].isimplicit ||
finfo[i].isstrict) /* OR in new attrs here */
{
appendPQExpBuffer(q, " WITH (");
@@ -3692,11 +3708,18 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i,
exit_nicely();
}
+ if (finfo[i].isimplicit)
+ {
+ appendPQExpBuffer(q, "%s implicitCoercion", listSep);
+ listSep = listSepComma;
+ }
+
if (finfo[i].isstrict)
{
appendPQExpBuffer(q, "%s isStrict", listSep);
listSep = listSepComma;
}
+
appendPQExpBuffer(q, " )");
}
@@ -4012,7 +4035,12 @@ dumpAggs(Archive *fout, AggInfo *agginfo, int numAggs,
resetPQExpBuffer(q);
appendPQExpBuffer(q, "AGGREGATE %s", aggSig->data);
- dumpComment(fout, q->data, agginfo[i].oid, "pg_aggregate", 0, NULL);
+ if (g_fout->remoteVersion < 70300)
+ dumpComment(fout, q->data, agginfo[i].oid, "pg_aggregate",
+ 0, NULL);
+ else
+ dumpComment(fout, q->data, agginfo[i].oid, "pg_proc",
+ 0, NULL);
}
destroyPQExpBuffer(q);
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
index 87bef9ba95..dc67a2efbe 100644
--- a/src/bin/pg_dump/pg_dump.h
+++ b/src/bin/pg_dump/pg_dump.h
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: pg_dump.h,v 1.80 2002/04/05 11:51:13 momjian Exp $
+ * $Id: pg_dump.h,v 1.81 2002/04/11 20:00:08 tgl Exp $
*
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
*
@@ -73,6 +73,7 @@ typedef struct _funcInfo
char *probin;
char *usename;
char provolatile; /* Attr */
+ bool isimplicit; /* Attr */
bool isstrict; /* Attr */
int dumped; /* 1 if already dumped */
} FuncInfo;
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index 68bbcfb802..5c00ba8781 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -3,7 +3,7 @@
*
* Copyright 2000 by PostgreSQL Global Development Group
*
- * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.48 2002/04/05 11:52:38 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.49 2002/04/11 20:00:08 tgl Exp $
*/
#include "postgres_fe.h"
#include "describe.h"
@@ -43,22 +43,23 @@ describeAggregates(const char *name)
/*
* There are two kinds of aggregates: ones that work on particular
- * types ones that work on all
+ * types and ones that work on all (denoted by input type = 0)
*/
snprintf(buf, sizeof(buf),
- "SELECT a.aggname AS \"%s\",\n"
- " CASE a.aggbasetype\n"
+ "SELECT p.proname AS \"%s\",\n"
+ " CASE p.proargtypes[0]\n"
" WHEN 0 THEN CAST('%s' AS text)\n"
- " ELSE format_type(a.aggbasetype, NULL)\n"
+ " ELSE format_type(p.proargtypes[0], NULL)\n"
" END AS \"%s\",\n"
- " obj_description(a.oid, 'pg_aggregate') as \"%s\"\n"
- "FROM pg_aggregate a\n",
+ " obj_description(p.oid, 'pg_proc') as \"%s\"\n"
+ "FROM pg_proc p\n"
+ "WHERE p.proisagg\n",
_("Name"), _("(all types)"),
_("Data type"), _("Description"));
if (name)
{
- strcat(buf, "WHERE a.aggname ~ '^");
+ strcat(buf, " AND p.proname ~ '^");
strncat(buf, name, REGEXP_CUTOFF);
strcat(buf, "'\n");
}
@@ -112,12 +113,12 @@ describeFunctions(const char *name, bool verbose)
if (!verbose)
strcat(buf,
"\nFROM pg_proc p\n"
- "WHERE p.prorettype <> 0 AND (pronargs = 0 OR oidvectortypes(p.proargtypes) <> '')\n");
+ "WHERE p.prorettype <> 0 AND (pronargs = 0 OR oidvectortypes(p.proargtypes) <> '') AND NOT p.proisagg\n");
else
strcat(buf,
"\nFROM pg_proc p, pg_language l, pg_user u\n"
"WHERE p.prolang = l.oid AND p.proowner = u.usesysid\n"
- " AND p.prorettype <> 0 AND (pronargs = 0 OR oidvectortypes(p.proargtypes) <> '')\n");
+ " AND p.prorettype <> 0 AND (pronargs = 0 OR oidvectortypes(p.proargtypes) <> '') AND NOT p.proisagg\n");
if (name)
{
@@ -347,16 +348,17 @@ objectDescription(const char *object)
"FROM (\n"
/* Aggregate descriptions */
- " SELECT a.oid as oid, a.tableoid as tableoid,\n"
- " CAST(a.aggname AS text) as name, CAST('%s' AS text) as object\n"
- " FROM pg_aggregate a\n"
+ " SELECT p.oid as oid, p.tableoid as tableoid,\n"
+ " CAST(p.proname AS text) as name, CAST('%s' AS text) as object\n"
+ " FROM pg_proc p\n"
+ " WHERE p.proisagg\n"
/* Function descriptions (except in/outs for datatypes) */
"UNION ALL\n"
" SELECT p.oid as oid, p.tableoid as tableoid,\n"
" CAST(p.proname AS text) as name, CAST('%s' AS text) as object\n"
" FROM pg_proc p\n"
- " WHERE p.pronargs = 0 or oidvectortypes(p.proargtypes) <> ''\n"
+ " WHERE (p.pronargs = 0 or oidvectortypes(p.proargtypes) <> '') AND NOT p.proisagg\n"
/* Operator descriptions (must get comment via associated function) */
"UNION ALL\n"
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index f25a45ef62..ce75211bbe 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -3,7 +3,7 @@
*
* Copyright 2000 by PostgreSQL Global Development Group
*
- * $Header: /cvsroot/pgsql/src/bin/psql/tab-complete.c,v 1.47 2002/04/01 03:34:27 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/tab-complete.c,v 1.48 2002/04/11 20:00:09 tgl Exp $
*/
/*----------------------------------------------------------------------
@@ -132,7 +132,7 @@ typedef struct
} pgsql_thing_t;
pgsql_thing_t words_after_create[] = {
- {"AGGREGATE", "SELECT distinct aggname FROM pg_aggregate WHERE substr(aggname,1,%d)='%s'"},
+ {"AGGREGATE", "SELECT distinct proname FROM pg_proc WHERE proisagg AND substr(proname,1,%d)='%s'"},
{"DATABASE", "SELECT datname FROM pg_database WHERE substr(datname,1,%d)='%s'"},
{"FUNCTION", "SELECT distinct proname FROM pg_proc WHERE substr(proname,1,%d)='%s'"},
{"GROUP", "SELECT groname FROM pg_group WHERE substr(groname,1,%d)='%s'"},