Обсуждение: BUG #16977: SET LC_TIME TO local_variable don't work

Поиск
Список
Период
Сортировка

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

От
PG Bug reporting form
Дата:
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$;


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

От
"David G. Johnston"
Дата:
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.