From aae0f061f2b417df36630a151f2be041f4aab81e Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Wed, 20 Nov 2024 16:30:11 -0600 Subject: [PATCH v1 1/1] attempt multibyte-aware truncation of database names --- src/backend/utils/init/postinit.c | 46 +++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 5b657a3f13..c64e8ac849 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -1003,14 +1003,54 @@ InitPostgres(const char *in_dbname, Oid dboid, { HeapTuple tuple; Form_pg_database dbform; + char trunc_dbname[NAMEDATALEN]; + + strncpy(trunc_dbname, in_dbname, NAMEDATALEN - 1); + trunc_dbname[NAMEDATALEN - 1] = '\0'; + + tuple = GetDatabaseTuple(trunc_dbname); + if (HeapTupleIsValid(tuple)) + strcpy(dbname, trunc_dbname); + + if (strlen(in_dbname) >= NAMEDATALEN && + IS_HIGHBIT_SET(in_dbname[NAMEDATALEN - 1]) && + IS_HIGHBIT_SET(in_dbname[NAMEDATALEN - 2])) + { + for (int i = 1; i < MAX_MULTIBYTE_CHAR_LEN - 1; i++) + { + HeapTuple tmp; + + trunc_dbname[NAMEDATALEN - 1 - i] = '\0'; + tmp = GetDatabaseTuple(trunc_dbname); + if (HeapTupleIsValid(tmp)) + { + if (HeapTupleIsValid(tuple)) + ereport(FATAL, + (errmsg("ambiguous database name"))); + tuple = tmp; + strcpy(dbname, trunc_dbname); + } + + if (!IS_HIGHBIT_SET(dbname[NAMEDATALEN - 2 - i])) + break; + } + } - tuple = GetDatabaseTuple(in_dbname); if (!HeapTupleIsValid(tuple)) ereport(FATAL, (errcode(ERRCODE_UNDEFINED_DATABASE), errmsg("database \"%s\" does not exist", in_dbname))); dbform = (Form_pg_database) GETSTRUCT(tuple); dboid = dbform->oid; + + if (MyProcPort && MyProcPort->database_name && + strcmp(MyProcPort->database_name, dbname) != 0) + { + pfree(MyProcPort->database_name); + MyProcPort->database_name = pstrdup(dbname); + + /* XXX: should we fix process title? */ + } } else if (!OidIsValid(dboid)) { @@ -1067,12 +1107,12 @@ InitPostgres(const char *in_dbname, Oid dboid, datform = (Form_pg_database) GETSTRUCT(tuple); if (!HeapTupleIsValid(tuple) || - (in_dbname && namestrcmp(&datform->datname, in_dbname))) + (in_dbname && namestrcmp(&datform->datname, dbname))) { if (in_dbname) ereport(FATAL, (errcode(ERRCODE_UNDEFINED_DATABASE), - errmsg("database \"%s\" does not exist", in_dbname), + errmsg("database \"%s\" does not exist", dbname), errdetail("It seems to have just been dropped or renamed."))); else ereport(FATAL, -- 2.39.5 (Apple Git-154)