31.12. 用戶定義操作符

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

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

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

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

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 和其它優化器提示的詳細訊息在下節給出。