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/bin | |
| parent | 3f6299df6c7d905bdef44eb3a4b19f248ebc14dc (diff) | |
| download | postgresql-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.c | 40 | ||||
| -rw-r--r-- | src/bin/pg_dump/pg_dump.h | 3 | ||||
| -rw-r--r-- | src/bin/psql/describe.c | 30 | ||||
| -rw-r--r-- | src/bin/psql/tab-complete.c | 4 |
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'"}, |
