Обсуждение: BUG #16977: SET LC_TIME TO local_variable don't work
The following bug has been logged on the website: Bug reference: 16977 Logged by: Dusan Djuric Email address: dusan.djuric@istratech.hr PostgreSQL version: 13.2 Operating system: Windows 10 Description: -- THIS DON'T WORK! CREATE OR REPLACE FUNCTION lctest(p_parameter varchar) RETURNS varchar LANGUAGE 'plpgsql' COST 100 VOLATILE PARALLEL UNSAFE AS $BODY$ DECLARE l_lc_time varchar; l_dateFormat varchar := 'TMDay, TMMonth dd.mm.yyyy'; l_current_date varchar; BEGIN l_lc_time := p_parameter; SET LC_TIME TO l_lc_time; select to_char(current_date, l_dateFormat) into l_current_date; RETURN l_current_date; END; $BODY$; -- THIS WORKS! CREATE OR REPLACE FUNCTION lctest(p_parameter varchar) RETURNS varchar LANGUAGE 'plpgsql' COST 100 VOLATILE PARALLEL UNSAFE AS $BODY$ DECLARE l_lc_time varchar; l_dateFormat varchar := 'TMDay, TMMonth dd.mm.yyyy'; l_current_date varchar; BEGIN l_lc_time := p_parameter; SET LC_TIME TO l_lc_time; IF l_lc_time = 'hr_HR.UTF8' THEN SET LC_TIME TO 'hr_HR.UTF8'; END IF; IF l_lc_time = 'en_EN.UTF8' THEN SET LC_TIME TO 'en_EN.UTF8'; END IF; select to_char(current_date, l_dateFormat) into l_current_date; RETURN l_current_date; END; $BODY$;
On Thu, Apr 22, 2021 at 6:26 AM PG Bug reporting form <noreply@postgresql.org> wrote:
The following bug has been logged on the website:
Bug reference: 16977
Logged by: Dusan Djuric
Email address: dusan.djuric@istratech.hr
PostgreSQL version: 13.2
Operating system: Windows 10
Description:
-- THIS DON'T WORK!
SET LC_TIME TO l_lc_time;
-- THIS WORKS!
l_lc_time := p_parameter;
I don't think this next line isn't doing what you think...
SET LC_TIME TO l_lc_time;
IF l_lc_time = 'hr_HR.UTF8' THEN
SET LC_TIME TO 'hr_HR.UTF8';
END IF;
IF l_lc_time = 'en_EN.UTF8' THEN
SET LC_TIME TO 'en_EN.UTF8';
END IF;
This isn't a bug. The SQL Command "SET" is not something that can take a parameter. Doing "EXECUTE sql_string;" is probably the simplest solution - build the SET command as a string and execute it.
David J.