Thread: ORDER BY in SQL functions
Are ORDER BYs allowed in SQL functions? Or do SQL functions work like views that are as unordered as their underlting tables? CREATE FUNCTION foo (INT) RETURNS SETOF INT AS ' SELECT id FROM table WHERE some_colunm > $1 ' LANGUAGE 'sql'; works. But if I try CREATE FUNCTION foo (INT) RETURNS SETOF INT AS ' SELECT id FROM table WHERE some_colunm > $1 ORDER BY some_other_colunm ' LANGUAGE 'sql'; the parser comes back with ERROR: function declared to return int4 returns multiple values in final retrieve The sorting must occur in the function, because once I have a set of IDs, there is no way to order them by some_other_column. The function cannot be rewritten in pl/pgsql because it may return more than one value. -- K. Ari Krupnikov DBDOM - bridging XML and relational databases http://www.iter.co.il
"K. Ari Krupnikov" <ari@iln.net> writes: > CREATE FUNCTION foo (INT) > RETURNS SETOF INT AS ' > SELECT id > FROM table > WHERE some_colunm > $1 > ORDER BY some_other_colunm > ' LANGUAGE 'sql'; > ERROR: function declared to return int4 returns multiple values in > final retrieve This is a bug in the SQL-function support --- the check for correct return type gets confused by the extra hidden column used for the ORDER BY. It'll work if you ORDER BY the column you're returning, not that that helps you much. It's fixed in 7.1. regards, tom lane
Tom Lane wrote: > > "K. Ari Krupnikov" <ari@iln.net> writes: > > CREATE FUNCTION foo (INT) > > RETURNS SETOF INT AS ' > > SELECT id > > FROM table > > WHERE some_colunm > $1 > > ORDER BY some_other_colunm > > ' LANGUAGE 'sql'; > > > ERROR: function declared to return int4 returns multiple values in > > final retrieve > > This is a bug in the SQL-function support --- the check for correct > return type gets confused by the extra hidden column used for the > ORDER BY. It'll work if you ORDER BY the column you're returning, > not that that helps you much. What if the function is declared to retun a complex type, can I then sort it? I it works, this function can be wrapped in another function that simply returns this single column. Also, why did I get this message after posting to comp.databases.postgresql.sql? Do articles in that group automatically get posted to the mailing list? > Subject: Stalled post to pgsql-sql > > Your message to pgsql-sql has been delayed > pending approval of the list owner for > the following reason(s): > > Non-Member Submission from "K. Ari Krupnikov" <ari@iln.net> -- K. Ari Krupnikov DBDOM - bridging XML and relational databases http://www.iter.co.il