在PostgreSQL 9.0和9.1之间,
从
enum
类型的工作方式有一些奇怪的更新。在PostgreSQL 9.1中,pg_catalog.pg_enum
表中有一个新列enumsortorder
。这个顺序似乎会覆盖基于OID的先前枚举排序。
PostgreSQL 9.0文档
对于特定的枚举类型,OID保证按照类型应该进行排序,但是与不相关的枚举类型的OID的排序没有保证。
PostgreSQL 9.1文档
pg_enum行的OID遵循一个特殊规则:偶数OID保证按其枚举类型的排序顺序进行排序。也就是说,如果两个偶数OID属于同一枚举类型,则较小的OID必须具有较小的enumsortorder值。奇数OID值与排序顺序无关。这个规则允许枚举比较例程在许多常见情况下避免目录查找。创建和更改枚举类型的例程尝试在可能的情况下将偶数OID分配给枚举值。
创建枚举类型时,其成员被分配排序位置1..n。但稍后添加的成员可能会被赋予负或分数值的enumsortorder。对这些值的唯一要求是它们在每个枚举类型内正确排序并且唯一。
我的问题
对于jOOQ代码生成器,我正在读取pg_catalog.pg_enum
表,按OID排序枚举文字,这是在PostgreSQL 9.0中指定的方式。根据更新的规范,似乎我应该按enumsortorder
排序文字,因为它似乎会以不同的方式尊重“中间”插入的枚举文字。从
pg_catalog
中读取这些枚举文字的最可靠、跨版本兼容的方法是什么?
pgsql-hackers
同意更改这个版本控制策略,但是一直没有得到任何回应。 - Craig Ringer