Postgresql Postgres截断外键标识符的具体算法是什么?

Postgresql Postgres截断外键标识符的具体算法是什么?,postgresql,Postgresql,我使用/贡献Haskell库(持久性)为Postgres生成迁移。该库通过读取Haskell数据类型来工作,然后生成与这些类型匹配的适当表 它通过查看基于Haskell类型的数据库模式(即名为Settings的Haskell记录意味着应创建名为Settings的表),然后将其与Postgres中的数据库模式进行比较(如果没有名为Settings的表,它将执行迁移以创建该表) 不幸的是,当Postgres截断标识符时,这种方法不能很好地工作,正如本文中提到的那样,它会截断63个字符的标识符。给出一

我使用/贡献Haskell库(持久性)为Postgres生成迁移。该库通过读取Haskell数据类型来工作,然后生成与这些类型匹配的适当表

它通过查看基于Haskell类型的数据库模式(即名为
Settings
的Haskell记录意味着应创建名为
Settings
的表),然后将其与Postgres中的数据库模式进行比较(如果没有名为
Settings
的表,它将执行迁移以创建该表)

不幸的是,当Postgres截断标识符时,这种方法不能很好地工作,正如本文中提到的那样,它会截断63个字符的标识符。给出一些SQL语句,如:

CREATE TABLE an_extremely_fantastically_super_long_name_child(an_extremely_fantastically_super_long_name_parent_id INTEGER NOT NULL REFERENCES an_extremely_fantastically_super_long_name_parent);

CREATE TABLE my_massively_huge_biggest_child_table (biggest_ever_column_name_that_will_reference_a_parent INTEGER NOT NULL REFERENCES an_extremely_fantastically_super_long_name_parent);
它将生成一个名为
my\u massively\u magnize\u chi\u magnize\u ever\u column\u name\u tha\u fkey
(删除一部分表名和一部分列名并添加
\u fkey
)的外键约束

我可以让Haskell库将它想要创建的所有标识符截断为63个字符,这将解决这个问题。但是,我希望与Postgres在使用
引用
语法时生成的内容保持兼容。为此,我需要复制Postgres中使用的算法。这个算法是什么?我曾尝试在Postgres源代码中搜索它,但由于Postgres是一个相当庞大的项目,很难找到


我想如果我给它足够的样本数据,我可以算出准确的公式,但只要看看源代码就好了。

~postgresql/src/backend/commands/indexcmds.c

在第2000行之后:
选择IndexName()
和friends


[这是针对索引的,但对于其他生成的名称,该方法类似]

在姐妹站点上询问这个问题可能更好,