PostgreSQL CREATE OPERATOR

2021-09-09 11:30 更新

CREATE OPERATOR — 定義一個新的操作符

大綱

CREATE OPERATOR name (    {FUNCTION|PROCEDURE} = function_name   [, LEFTARG = left_type ] [, RIGHTARG = right_type ]
    [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
    [, RESTRICT = res_proc ] [, JOIN = join_proc ]
    [, HASHES ] [, MERGES ])

描述

CREATE OPERATOR定義一個新的操作符 name。定義操作符 的用戶會成為該操作符的擁有者。如果給出一個模式名,該操作符將被創(chuàng)建 在指定的模式中。否則它會被創(chuàng)建在當(dāng)前模式中。

操作符名稱是最多NAMEDATALEN-1(默認為 63) 個字符的序列,這些字符可以是:


+ - * / < > = ~ ! @ # % ^ & | ` ?

對名稱的選擇有一些限制:

  • -- and /*不能出現(xiàn)在 操作符名稱中,因為它們會被當(dāng)做一段注釋的開始。

  • 多字符操作符名稱不能以+或者- 結(jié)束,除非該名稱也包含至少一個下列字符:


    ~ ! @ # % ^ & | ` ?

    例如,@-是一個被允許的操作符名稱,而 *-不是。這種限制允許 PostgreSQL解析 SQL 兼容的命令 而無需記號之間的空格。

  • =>用作一個操作符名稱已經(jīng)不被推薦。在未來的發(fā)行中 可能會被禁用。

在輸入時!=會被映射為<>, 因此這兩個名字總是等效的。

必須至少定義LEFTARGRIGHTARG中的一個。 對于二元操作符,兩者都必須被定義。對于右一元操作符,只應(yīng)該定義 LEFTARG,而對于左一元操作符只應(yīng)該定義 RIGHTARG。

注意

右一元運算符(也稱為后綴)已棄用,并將在PostgreSQL版本14中刪除。

function_name函數(shù) 必須在之前已經(jīng)用CREATE FUNCTION定義好, 并且必須被定義為接受正確數(shù)量的指定類型的參數(shù)。

CREATE OPERATOR的語法中,關(guān)鍵詞FUNCTIONPROCEDURE是等效的,但不管哪種情況下被引用的函數(shù)都必須是一個函數(shù)而不是過程。這里對關(guān)鍵詞PROCEDURE的是用是有歷史原因的,現(xiàn)在已經(jīng)被廢棄。

其他子句指定可選的操作符優(yōu)化子句。它們的含義在 第 37.15 節(jié)中有詳細描述。

要創(chuàng)建一個操作符,必須具有參數(shù)類型和返回類型上的USAGE 特權(quán),以及底層函數(shù)上的EXECUTE特權(quán)。如果指定了一個 交換子或者求反器操作符,必須擁有這些操作符。

參數(shù)

name

要定義的操作符的名稱。允許使用的字符請見上文。名稱可以被模式 限定,例如CREATE OPERATOR myschema.+ (...)。如果 沒有被模式限定,該操作符將被創(chuàng)建在當(dāng)前模式中。如果兩個同一模式 中的操作符在不同的數(shù)據(jù)類型上操作,它們可以具有相同的名稱。這 被稱為重載。

function_name

用來實現(xiàn)這個操作符的函數(shù)。

left_type

這個操作符的左操作數(shù)(如果有)的數(shù)據(jù)類型。忽略這個選項 可以表示一個左一元操作符。

right_type

這個操作符的右操作數(shù)(如果有)的數(shù)據(jù)類型。忽略這個選項 可以表示一個右一元操作符。

com_op

這個操作符的交換子。

neg_op

這個操作符的求反器。

res_proc

用于這個操作符的限制選擇度估計函數(shù)。

join_proc

用于這個操作符的連接選擇度估算函數(shù)。

HASHES

表示這個操作符可以支持哈希連接。

MERGES

表示這個操作符可以支持歸并連接。

要在com_op 或者其他可選參數(shù)中給出一個模式限定的操作符名稱, 請使用OPERATOR()語法,例如:

COMMUTATOR = OPERATOR(myschema.===) ,

注解

進一步的信息可參考第 37.14 節(jié)。

無法在CREATE OPERATOR中指定一個操作符的 詞法優(yōu)先級,因為解析器的優(yōu)先級行為是硬寫在代碼中的。詳見 第 4.1.6 節(jié)。

廢棄的選項SORT1、SORT2、 LTCMP以及GTCMP以前被用來指定與支持 歸并連接的操作符相關(guān)的排序操作符的名稱?,F(xiàn)在不再需要它們了,因為 相關(guān)操作符的信息可以在 B-樹的操作符族中找到。如果給出了這些選項 之一,它會被忽略(除非是為了隱式設(shè)置MERGES為真)。

使用DROP OPERATOR從數(shù)據(jù)庫中刪除用戶定義的操作符。 使用ALTER OPERATOR修改數(shù)據(jù)庫中的操作符。

示例

下面的命令為數(shù)據(jù)類型box定義了一種新的操作符--面積相等:

CREATE OPERATOR === (
    LEFTARG = box,
    RIGHTARG = box,
    FUNCTION = area_equal_function,
    COMMUTATOR = ===,
    NEGATOR = !==,
    RESTRICT = area_restriction_function,
    JOIN = area_join_function,
    HASHES, MERGES
);

兼容性

CREATE OPERATOR是一種 PostgreSQL擴展。在 SQL 標(biāo)準(zhǔn)中沒有用戶定義操作符的規(guī)定。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號