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.
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 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.