BUG #16977: SET LC_TIME TO local_variable don't work

Started by PG Bug reporting formabout 5 years ago2 messagesbugs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

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$;

#2David G. Johnston
david.g.johnston@gmail.com
In reply to: PG Bug reporting form (#1)
Re: BUG #16977: SET LC_TIME TO local_variable don't work

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.