14.5. 创建操作符和支持过程

既然我们已经了解了这些概念,那么现在就是我们承诺过的创建一个 新的操作符表的例子。首先,我们需要一个操作符集合。 用于定义操作符的过程已经在Chapter 11讨论过了. 对这个用于 B-tree 的 complex_abs_ops 操作符表, 我们需要的操作符是:

假设实现这些函数的代码放在文件 PGROOT/tutorial/complex.c里, 我们已经把它编译成 PGROOT/tutorial/complex.so

有一部分 C 代码看起来象∶

#define Mag(c) ((c)->x*(c)->x + (c)->y*(c)->y)

         bool
         complex_abs_eq(Complex *a, Complex *b)
         {
             double amag = Mag(a), bmag = Mag(b);
             return (amag==bmag);
         }

(请注意我们在本例的文本中只显示相等操作符. 其它四个操作符非常类似.请参考 complex.ccomplex.source 获取细节.)

我们用下面语句让PostgreSQL这样识别这个函数:

CREATE FUNCTION complex_abs_eq(complex, complex) RETURNS boolean
    AS 'PGROOT/src/tutorial/complex'
    LANGUAGE C;

有几个很重要的问题要在这里出现∶

现在可以定义使用它们的操作符了:

CREATE OPERATOR = (
     leftarg = complex, rightarg = complex,
     procedure = complex_abs_eq,
     restrict = eqsel, join = eqjoinsel
         );

里的重要问题是过程名称(就是上面定义的 C 函数) 和这个关系和连接选择性函数. 你应该只使用例子里(参阅 complex.source )的选择性函数.请注意还要有这样的用于小于,等于和大于情况的函数. 你必须提供这些(函数),否则优化器将无法有效地使用该索引.

下一步是注册 B-tree 需要的比较"支持过程"。 实现这个的 C 代码在包含操作符过程的同一个文件中:

CREATE FUNCTION complex_abs_cmp(complex, complex)
    RETURNS integer
    AS 'PGROOT/src/tutorial/complex'
    LANGUAGE C;