Re: PostgreSQL Bug with simple function unexpectedly treating varchar parameter as an array

Поиск
Список
Период
Сортировка
От Rumpi Gravenstein
Тема Re: PostgreSQL Bug with simple function unexpectedly treating varchar parameter as an array
Дата
Msg-id CAEpg1wA=sJ4Cvs3hUN9rfYBwTC74uFWYUzQGfcfZC4u-K1AH7w@mail.gmail.com
обсуждение исходный текст
Ответ на PostgreSQL Bug with simple function unexpectedly treating varchar parameter as an array  ("David G. Johnston" <david.g.johnston@gmail.com>)
Ответы Re: PostgreSQL Bug with simple function unexpectedly treating varchar parameter as an array
Список pgsql-general
Here's a reproducible test case that causes the problem in different schemas.  The issue appears to be related to creating a table and a function that has the same name as the table with a prepended underscore.

rumpi_test  -- table name
_rumpi_test -- function name

Here's the test case;

SELECT version();

drop table if exists rumpi_test;

create table rumpi_test( col1 varchar, col2 varchar);


drop function if exists rumpi_test;

CREATE OR REPLACE FUNCTION _rumpi_test( col1 varchar)

RETURNS varchar

LANGUAGE plpgsql

AS

$function$

declare

begin

raise info '%',_col1::varchar;

return('Done');

end;

$function$;


select _rumpi_test('hello');


Here what I get when I run this in psql:

xxx_pub_dev_2_db=> SELECT version();
                                                 version
---------------------------------------------------------------------------------------------------------
 PostgreSQL 16.9 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-26), 64-bit
(1 row)


xxx_pub_dev_2_db=>
xxx_pub_dev_2_db=> drop table if exists rumpi_test;
DROP TABLE
xxx_pub_dev_2_db=>
xxx_pub_dev_2_db=> create table rumpi_test( col1 varchar, col2 varchar);
CREATE TABLE
xxx_pub_dev_2_db=>
xxx_pub_dev_2_db=>
xxx_pub_dev_2_db=>
xxx_pub_dev_2_db=> drop function if exists rumpi_test;
NOTICE:  function rumpi_test() does not exist, skipping
DROP FUNCTION
xxx_pub_dev_2_db=>
xxx_pub_dev_2_db=> CREATE OR REPLACE FUNCTION _rumpi_test( col1 varchar)
xxx_pub_dev_2_db->
xxx_pub_dev_2_db-> RETURNS varchar
xxx_pub_dev_2_db->
xxx_pub_dev_2_db-> LANGUAGE plpgsql
xxx_pub_dev_2_db->
xxx_pub_dev_2_db-> AS
xxx_pub_dev_2_db->
xxx_pub_dev_2_db-> $function$
xxx_pub_dev_2_db$>
xxx_pub_dev_2_db$> declare
xxx_pub_dev_2_db$>
xxx_pub_dev_2_db$> begin
xxx_pub_dev_2_db$>
xxx_pub_dev_2_db$> raise info '%',_col1::varchar;
xxx_pub_dev_2_db$>
xxx_pub_dev_2_db$>   return('Done');
xxx_pub_dev_2_db$>
xxx_pub_dev_2_db$> end;
xxx_pub_dev_2_db$>
xxx_pub_dev_2_db$> $function$;
CREATE FUNCTION
xxx_pub_dev_2_db=>
xxx_pub_dev_2_db=>
xxx_pub_dev_2_db=>
xxx_pub_dev_2_db=> select _rumpi_test('hello');
ERROR:  malformed array literal: "hello"
LINE 1: select _rumpi_test('hello');
                           ^
DETAIL:  Array value must start with "{" or dimension information.
xxx_pub_dev_2_db=>



On Wed, Aug 6, 2025 at 4:43 PM David G. Johnston <david.g.johnston@gmail.com> wrote:
On Wednesday, August 6, 2025, Rumpi Gravenstein <rgravens@gmail.com> wrote:

xxx_pub_dev_2_db=# drop FUNCTION if exists _sa_setup_role;
DROP FUNCTION
xxx_pub_dev_2_db=# select proname, pronamespace, oid from pg_proc where proname like '%sa_setup%';
proname | pronamespace | oid
---------+--------------+-----
(0 rows)
 
xxx_pub_dev_2_db=# select _sa_setup_role('af_repo_app');
ERROR:  malformed array literal: "af_repo_app"
LINE 1: select _sa_setup_role('af_repo_app');
                              ^
DETAIL:  Array value must start with "{" or dimension information.
xxx_pub_dev_2_db=#

Yeah, we’ve already pretty much decided this function has nothing to do with it.  Go look at pg_type per the last example demonstrating the same error without the involvement of any user-defined function.

David J.



--
Rumpi Gravenstein

В списке pgsql-general по дате отправления: