pgsql: Support "variadic" functions, which can accept a variable number

Lists: pgsql-committers
From: tgl(at)postgresql(dot)org (Tom Lane)
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Support "variadic" functions, which can accept a variable number
Date: 2008-07-16 01:30:24
Message-ID: 20080716013024.0E374754A84@cvs.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-committers

Log Message:
-----------
Support "variadic" functions, which can accept a variable number of arguments
so long as all the trailing arguments are of the same (non-array) type.
The function receives them as a single array argument (which is why they
have to all be the same type).

It might be useful to extend this facility to aggregates, but this patch
doesn't do that.

This patch imposes a noticeable slowdown on function lookup --- a follow-on
patch will fix that by adding a redundant column to pg_proc.

Pavel Stehule

Modified Files:
--------------
pgsql/doc/src/sgml:
catalogs.sgml (r2.168 -> r2.169)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/catalogs.sgml?r1=2.168&r2=2.169)
extend.sgml (r1.36 -> r1.37)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/extend.sgml?r1=1.36&r2=1.37)
plpgsql.sgml (r1.131 -> r1.132)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/plpgsql.sgml?r1=1.131&r2=1.132)
typeconv.sgml (r1.54 -> r1.55)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/typeconv.sgml?r1=1.54&r2=1.55)
xfunc.sgml (r1.130 -> r1.131)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/xfunc.sgml?r1=1.130&r2=1.131)
pgsql/doc/src/sgml/ref:
alter_function.sgml (r1.15 -> r1.16)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/ref/alter_function.sgml?r1=1.15&r2=1.16)
comment.sgml (r1.36 -> r1.37)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/ref/comment.sgml?r1=1.36&r2=1.37)
create_function.sgml (r1.78 -> r1.79)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/ref/create_function.sgml?r1=1.78&r2=1.79)
drop_function.sgml (r1.33 -> r1.34)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/ref/drop_function.sgml?r1=1.33&r2=1.34)
pgsql/src/backend/catalog:
information_schema.sql (r1.43 -> r1.44)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/catalog/information_schema.sql?r1=1.43&r2=1.44)
namespace.c (r1.107 -> r1.108)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/catalog/namespace.c?r1=1.107&r2=1.108)
pg_aggregate.c (r1.93 -> r1.94)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/catalog/pg_aggregate.c?r1=1.93&r2=1.94)
pgsql/src/backend/commands:
functioncmds.c (r1.95 -> r1.96)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/commands/functioncmds.c?r1=1.95&r2=1.96)
pgsql/src/backend/nodes:
copyfuncs.c (r1.394 -> r1.395)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/nodes/copyfuncs.c?r1=1.394&r2=1.395)
equalfuncs.c (r1.323 -> r1.324)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/nodes/equalfuncs.c?r1=1.323&r2=1.324)
outfuncs.c (r1.326 -> r1.327)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/nodes/outfuncs.c?r1=1.326&r2=1.327)
pgsql/src/backend/parser:
gram.y (r2.616 -> r2.617)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/parser/gram.y?r1=2.616&r2=2.617)
keywords.c (r1.198 -> r1.199)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/parser/keywords.c?r1=1.198&r2=1.199)
parse_expr.c (r1.228 -> r1.229)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/parser/parse_expr.c?r1=1.228&r2=1.229)
parse_func.c (r1.202 -> r1.203)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/parser/parse_func.c?r1=1.202&r2=1.203)
parse_utilcmd.c (r2.13 -> r2.14)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/parser/parse_utilcmd.c?r1=2.13&r2=2.14)
pgsql/src/backend/utils/adt:
regproc.c (r1.107 -> r1.108)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/utils/adt/regproc.c?r1=1.107&r2=1.108)
ruleutils.c (r1.275 -> r1.276)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/utils/adt/ruleutils.c?r1=1.275&r2=1.276)
pgsql/src/backend/utils/fmgr:
funcapi.c (r1.39 -> r1.40)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/utils/fmgr/funcapi.c?r1=1.39&r2=1.40)
pgsql/src/bin/pg_dump:
pg_dump.c (r1.493 -> r1.494)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/bin/pg_dump/pg_dump.c?r1=1.493&r2=1.494)
pgsql/src/bin/psql:
describe.c (r1.181 -> r1.182)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/bin/psql/describe.c?r1=1.181&r2=1.182)
pgsql/src/include/catalog:
catversion.h (r1.468 -> r1.469)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/include/catalog/catversion.h?r1=1.468&r2=1.469)
namespace.h (r1.54 -> r1.55)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/include/catalog/namespace.h?r1=1.54&r2=1.55)
pg_proc.h (r1.506 -> r1.507)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/include/catalog/pg_proc.h?r1=1.506&r2=1.507)
pgsql/src/include/nodes:
parsenodes.h (r1.366 -> r1.367)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/include/nodes/parsenodes.h?r1=1.366&r2=1.367)
pgsql/src/include/parser:
parse_func.h (r1.59 -> r1.60)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/include/parser/parse_func.h?r1=1.59&r2=1.60)
pgsql/src/interfaces/ecpg/preproc:
preproc.y (r1.368 -> r1.369)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/interfaces/ecpg/preproc/preproc.y?r1=1.368&r2=1.369)
pgsql/src/pl/plpgsql/src:
pl_comp.c (r1.126 -> r1.127)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/pl/plpgsql/src/pl_comp.c?r1=1.126&r2=1.127)
pgsql/src/pl/plpython:
plpython.c (r1.110 -> r1.111)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/pl/plpython/plpython.c?r1=1.110&r2=1.111)
pgsql/src/test/regress/expected:
plpgsql.out (r1.64 -> r1.65)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/expected/plpgsql.out?r1=1.64&r2=1.65)
polymorphism.out (r1.12 -> r1.13)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/expected/polymorphism.out?r1=1.12&r2=1.13)
pgsql/src/test/regress/sql:
plpgsql.sql (r1.54 -> r1.55)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/sql/plpgsql.sql?r1=1.54&r2=1.55)
polymorphism.sql (r1.5 -> r1.6)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/sql/polymorphism.sql?r1=1.5&r2=1.6)


From: Simon Riggs <simon(at)2ndquadrant(dot)com>
To: Tom Lane <tgl(at)postgresql(dot)org>
Cc: pgsql-committers(at)postgresql(dot)org
Subject: Re: pgsql: Support "variadic" functions, which can accept a variable number
Date: 2008-07-16 17:42:59
Message-ID: 1216230179.19656.372.camel@ebony.2ndQuadrant
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-committers


On Wed, 2008-07-16 at 01:30 +0000, Tom Lane wrote:

> create_function.sgml (r1.78 -> r1.79)
> (http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/ref/create_function.sgml?r1=1.78&r2=1.79)

I think CREATE FUNCTION should specifically mention that VARIADIC can
only be used as the arg mode of the last parameter. Other pages mention
this, but the syntax doesn't, which could confuse people. Like me, who
started with the CREATE FUNCTION page, rather than other parts of the
docs.

--
Simon Riggs www.2ndQuadrant.com
PostgreSQL Training, Services and Support


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: simon(at)2ndquadrant(dot)com
Cc: pgsql-committers(at)postgresql(dot)org
Subject: Re: pgsql: Support "variadic" functions, which can accept a variable number
Date: 2008-07-18 03:33:58
Message-ID: 9133.1216352038@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-committers

Simon Riggs <simon(at)2ndquadrant(dot)com> writes:
> I think CREATE FUNCTION should specifically mention that VARIADIC can
> only be used as the arg mode of the last parameter. Other pages mention
> this, but the syntax doesn't, which could confuse people. Like me, who
> started with the CREATE FUNCTION page, rather than other parts of the
> docs.

Done in connection with the TABLE-function docs update.

regards, tom lane