Причина этого заключается в том, что все имена объектов относятся к типу данных name
. Сравните определение pg_namespace
, которое является системным каталогом, содержащим схемы:
\d pg_namespace
Table "pg_catalog.pg_namespace"
Column | Type | Collation | Nullable | Default
----------+-----------+-----------+----------+---------
nspname | name | | not null |
nspowner | oid | | not null |
nspacl | aclitem[] | | |
Indexes:
"pg_namespace_nspname_index" UNIQUE, btree (nspname)
"pg_namespace_oid_index" UNIQUE, btree (oid)
name
определено в src/include/c.h
(NAMEDATALEN
равно 64, но последний байт равен 0, поэтому эффективная длина равна 63):
/*
* Representation of a Name: effectively just a C string, but null-padded to
* exactly NAMEDATALEN bytes. The use of a struct is historical.
*/
typedef struct nameData
{
char data[NAMEDATALEN];
} NameData;
typedef NameData *Name;
#define NameStr(name) ((name).data)
Когда анализатор обрабатывает идентификатор, он усекает его до NAMEDATALEN-1
.
Это усечение подняло NOTICE
с начала ( commit 0672a3c081 с июня 2000 г.), поэтому я был бы удивлен, если бы вы не увидели это уведомление (если вы не установили для client_min_messages
значение warning
или error
).
search_path
- это обычная строка C без ограничения длины, поэтому она может содержать имена схем, длина которых превышает 63 байта, но поскольку записи преобразуются в name
, дополнительные символы фактически игнорируются.
Это не красиво, и я бы сказал, что сообщение должно быть, по крайней мере, WARNING
. Вы можете добавить его в список рассылки хакеров (или написать для него патч). Повышение уровня до ERROR
было бы самым чистым решением, но было бы плохо для обратной совместимости.