BUG #1309: PL/PGSQL function: ORDER BY does not accept variables

Started by PostgreSQL Bugs Listover 21 years ago2 messagesbugs
Jump to latest
#1PostgreSQL Bugs List
pgsql-bugs@postgresql.org

The following bug has been logged online:

Bug reference: 1309
Logged by: Christina Zhang

Email address: czhang@theinformationforge.com

PostgreSQL version: 7.4.1

Operating system: Linux

Description: PL/PGSQL function: ORDER BY does not accept variables

Details:

When we write a function using PL/PGSQL:

CREATE OR REPLACE FUNCTION uf_TestSearch(integer,varchar)RETURNS setof
ut_TestSearch
AS
'
DECLARE
v_MyRow ut_TestSearch%rowtype;
a_OrderBy ALIAS FOR $1;
a_SortAsc ALIAS FOR $2;
BEGIN
FOR v_MyRow IN
SELECT Colum1,
Column2,
Column3
FROM Table1
ORDER BY a_OrderBy a_SortAsc
LOOP
RETURN NEXT v_MyRow;
END LOOP;
RETURN;

RETURN;

END;
'LANGUAGE 'plpgsql';

Problem: When I use PERFORM uf_TestSearch(1,'ASC');
The returned result set are always sorted by "Column2", no matter what is
passed in the first parameter.

Could you please check whether the ORDER BY works correctly or not?

Thank you,

Christina

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: PostgreSQL Bugs List (#1)
Re: BUG #1309: PL/PGSQL function: ORDER BY does not accept variables

"PostgreSQL Bugs List" <pgsql-bugs@postgresql.org> writes:

DECLARE
v_MyRow ut_TestSearch%rowtype;
a_OrderBy ALIAS FOR $1;
a_SortAsc ALIAS FOR $2;
BEGIN
FOR v_MyRow IN
SELECT Colum1,
Column2,
Column3
FROM Table1
ORDER BY a_OrderBy a_SortAsc
LOOP
RETURN NEXT v_MyRow;
END LOOP;

You could make that work using FOR ... IN EXECUTE, but as-is it's a syntax
error. You can't use plpgsql variables to interpolate keywords, or even
column names into a regular SQL command; they are *values* and nothing
more. (Indeed it would be exceedingly dangerous if they worked the way
you're supposing.)

Something like

FOR v_MyRow IN EXECUTE
''SELECT Colum1,
Column2,
Column3
FROM Table1
ORDER BY '' || quote_identifier(a_OrderBy) || '' '' || a_SortAsc
LOOP

would do what you intended.

regards, tom lane