Em ter., 1 de abr. de 2025 às 15:39, Noah Misch <noah@leadboat.com> escreveu:
On Thu, Feb 27, 2025 at 10:23:31AM -0300, Ranier Vilela wrote: > Em qui., 27 de fev. de 2025 às 02:51, Michael Paquier <michael@paquier.xyz> > escreveu: > > > On Tue, Feb 25, 2025 at 08:54:31AM -0300, Ranier Vilela wrote: > > > @@ -455,7 +455,9 @@ set_locale_and_encoding(void) > > > locale->db_locale, > > > strlen(locale->db_locale)); > > > else > > > - datlocale_literal = pg_strdup("NULL"); > > > + datlocale_literal = PQescapeLiteral(conn_new_template1, > > > + "NULL", > > > + strlen("NULL")); > > > > Yeah, I've considered that but hardcoding NULL twice felt a bit weird, > > as well. Perhaps it's slightly cleaner to use an intermediate > > variable given then as an argument of PQescapeLiteral()? > > > Yeah, I also think it would look good like this.
This became commit 2a083ab "pg_upgrade: Fix inconsistency in memory freeing". PQescapeLiteral("NULL") is "'NULL'", so this causes pg_database.datlocale to contain datlocale='NULL'::text instead of datlocale IS NULL.
I believe the intention of the query is: For example: UPDATE pg_catalog.pg_database SET encoding = 6, datlocprovider = 'c', datlocale = NULL WHERE datname = 'template0';
Where datlocale with NULL is correct no?
Because:
UPDATE pg_catalog.pg_database SET encoding = 6, datlocprovider = 'c', datlocale IS NULL WHERE datname = 'template0';
ERROR: syntax error at or near "IS" LINE 4: datlocale IS NULL