Hello GREATEST and LEAST are SQL functions, but it is not internal functions listed in pg_proc table due different implementation. It is much more similar to CASE statement than function although syntax is same. for your purpose, you should to create SQL function wrapper of this construct - then necessary entry in pg_proc will be done, and you can use as aggregate sfunc function CREATE OR REPLACE FUNCTION public.greatest2(text, text) RETURNS text LANGUAGE sql AS $function$ SELECT greatest($1,$2) $function$ postgres=# CREATE AGGREGATE text_max(text) (SFUNC=greatest2, STYPE=text); CREATE AGGREGATE postgres=# SELECT * FROM test; a --------- Ahoj Zdravim (2 rows) postgres=# SELECT text_max(a) FROM test; text_max ---------- Zdravim (1 row) 2013/6/25 Ryan Kelly <rpkelly22@xxxxxxxxx>: > In trying to learn about aggregates, I came across this seemingly odd > behavior: > > (postgres@[local]:5435 08:27:42) [postgres]> CREATE AGGREGATE example_max (TEXT) (SFUNC = greatest, STYPE = TEXT); > ERROR: syntax error at or near "greatest" > LINE 1: CREATE AGGREGATE example_max (TEXT) (SFUNC = greatest, STYPE... > ^ > > Of course, this is a silly example (one could just use max), but I'm > interested in knowing why greatest cannot be used here. Someone on IRC > mentioned that it was because "greatest was not actually a function" but > the documentation for greatest says nothing along those lines: > http://www.postgresql.org/docs/9.2/static/functions-conditional.html#FUNCTIONS-GREATEST-LEAST > > The documentation also indicates that greatest is non-reserved (cannot > be function or type): > http://www.postgresql.org/docs/9.2/static/sql-keywords-appendix.html > > But I'm not sure I understand how to interpret the "cannot be function > or type" or portion of that. what is important for this case, is entry in pg_proc system table. Functions with entry are "normal" creatures. Functions without entry are "strange" creatures (from different reasons). Some years ago PostgreSQL didn't support variadic functions, and implementation of any variadic functions required some deeper hacking. There are still some limitation - is not possible to write variadic functions with same functionality yet, so it is reason why these functions are not reimplemented. It was my first or second patch for Postgres and it was great tutorial of Postgres internals :) Regards Pavel > > Quoting "greatest" causes this error instead: > (postgres@[local]:5435 08:30:08) [postgres]> CREATE AGGREGATE example_max (TEXT) (SFUNC = "greatest", STYPE = TEXT); > ERROR: function greatest(text, text) does not exist > > Which I would assume is because greatest is variadic and not simply a > function of two arguments. > > I'm sure I'm just being dense and missing something obvious here... > > -Ryan P. Kelly > > > > -- > Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-general -- Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general