【发布时间】:2013-08-26 06:06:57
【问题描述】:
enum 类型在 PostgreSQL 9.0 和 9.1 之间的工作方式发生了一些奇怪的更新。 pg_catalog.pg_enum 表在 PostgreSQL 9.1 中有一个新列 enumsortorder。这个顺序似乎覆盖了之前基于 OID 的枚举顺序。
PostgreSQL 9.0 Documentation
保证特定枚举类型的 OID 以该类型应排序的方式排序,但不保证不相关枚举类型的 OID 的排序。
PostgreSQL 9.1 Documentation
pg_enum 行的 OID 遵循一个特殊规则:偶数 OID 保证按照与其枚举类型的排序顺序相同的方式排序。也就是说,如果两个偶数 OID 属于同一个枚举类型,则较小的 OID 必须具有较小的 enumsortorder 值。奇数 OID 值与排序顺序无关。此规则允许枚举比较例程在许多常见情况下避免目录查找。创建和更改枚举类型的例程会尽可能尝试将 OID 分配给枚举值。
创建枚举类型时,为其成员分配排序顺序位置 1..n。但是稍后添加的成员可能会被赋予负数或小数的 enumsortorder 值。对这些值的唯一要求是它们在每个枚举类型中的顺序正确且唯一。
我的问题
对于jOOQ code generator,我正在阅读pg_catalog.pg_enum 表,按OID 对枚举字面量进行排序,这是在PostgreSQL 9.0 中指定的方式。使用更新的规范,我似乎应该按enumsortorder 对文字进行排序,这似乎表现不同,因为它尊重“中间”的枚举文字插入。
从pg_catalog 读取这些枚举文字的最可靠、跨版本兼容的方法是什么?
【问题讨论】:
标签: sql postgresql postgresql-9.1 jooq postgresql-9.0