33.11. 用戶定義操作符

每個操作符都是對真正幹活的對應函數的"語義修飾"; 所以你在創建操作符之前必須先創建對應的函數。 不過,一個操作符也並不僅僅是語義修飾, 因為它還帶著可以幫助查詢規劃器優化使用該操作符的查詢的附加信息。 下一節將用于解釋這些附加的信息.

操作符。操作符可以重載;也就是說,同一個操作符名字可以用于不同的, 擁有不同的數目和類型的操作數的操作符。在執行一個查詢的時候,系統 從名字和提供的操作符類型上判斷需要調用哪個操作符。

下面是一個創建用于兩個復數相加的操作符的例子。 我們假設已經創建了complex (見Section 33.10) 類型的定義。首先我們需要做(相加)工作 的函數;然後我們就可以定義操作符:

CREATE FUNCTION complex_add(complex, complex)
    RETURNS complex
    AS 'filename', 'complex_add'
    LANGUAGE C;

CREATE OPERATOR + (
    leftarg = complex,
    rightarg = complex,
    procedure = complex_add,
    commutator = +
);

現在我們可以執行像下面這樣的查詢:

SELECT (a + b) AS c FROM test_complex;

        c
-----------------
 (5.2,6.05)
 (133.42,144.95)

我們在這裡已經演示了如何創建雙目操作符。要創建單目操作符, 只需要省略leftarg(對左目操作符)或者rightarg (對右操作符)即可。只有procedure子句和參數(argument)子句 是 CREATE OPERATOR 裡需要的條目。 例子裡演示的 commutator 子句是一個給查詢優化器的可選的暗示。 關于 commutator 和其它優化器提示的詳細信息在下節給出。