CREATE OPERATOR定義一個新的操作符 name。
簡介
CREATE OPERATOR定義一個新的操作符name。定義操作符的使用者會成為該操作符的擁有者。如果給出一個模式名,該操作符將被建立在指定的模式中。否則它會被建立在當前模式中。
操作符名稱是最多NAMEDATALEN-1(預設為 63) 個字元的序列,這些字元可以是:
+ - * / < > = ~ ! @ # % ^ > | ` ?
對名稱的選擇有以下限制:
--and/不能出現在操作符名稱中,因為它們會被當做一段注釋的開始。多字元操作符名稱不能以
+或者-結束,除非該名稱也包含至少一個下列字元: ~ ! @ # % ^ & | ` ? 例如,@-是一個被允許的操作符名稱,而-不是。這種限制允許 PolarDB解析 SQL 相容的命令而無需記號之間的空格。將
=>用作一個操作符名稱已經不被推薦。在未來的發行中可能會被禁用。
在輸入時!=會被映射為<>, 因此這兩個名字總是等效的。
必須至少定義LEFTARG和RIGHTARG中的一個。 對於二元操作符,兩者都必須被定義。對於右一元操作符,只應該定義 LEFTARG,而對於左一元操作符只應該定義 RIGHTARG。
文法
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 ]
)說明
右一元運算子(也稱為尾碼)已棄用。
function_name函數必須在之前已經用CREATE FUNCTION定義好, 並且必須被定義為接受正確數量的指定類型的參數。
在CREATE OPERATOR的文法中,關鍵詞FUNCTION和PROCEDURE是等效的,但不管哪種情況下被引用的函數都必須是一個函數而不是過程。這裡對關鍵詞PROCEDURE的是用是有歷史原因的,現在已經被廢棄。
其他子句指定可選的操作符最佳化子句,要建立一個操作符,必須具有參數類型和傳回型別上的USAGE 特權,以及底層函數上的EXECUTE特權。如果指定了一個交換子或者求反器操作符,必須擁有這些操作符。
無法在CREATE OPERATOR中指定一個操作符的詞法優先順序,因為解析器的優先順序行為是硬寫在代碼中的。
廢棄的選項SORT1、SORT2、 LTCMP以及GTCMP以前被用來指定與支援歸併串連的操作符相關的排序操作符的名稱。現在不再需要它們了,因為相關操作符的資訊可以在 B-樹的操作符族中找到。如果給出了這些選項之一,它會被忽略(除非是為了隱式設定MERGES為真)。
使用 DROP OPERATOR 從資料庫中刪除使用者定義的操作符,使用 ALTER OPERATOR 修改資料庫中的操作符。
參數
name要定義的操作符的名稱。允許使用的字元請見上文。名稱可以被模式限定,例如CREATE OPERATOR myschema.+ (...)。如果沒有被模式限定,該操作符將被建立在當前模式中。如果兩個同一模式中的操作符在不同的資料類型上操作,它們可以具有相同的名稱。這被稱為重載。
function_name用來實現這個操作符的函數。
left_type這個操作符的左運算元(如果有)的資料類型。忽略這個選項可以表示一個左一元操作符。
right_type這個操作符的右運算元(如果有)的資料類型。忽略這個選項可以表示一個右一元操作符。
com_op這個操作符的交換子。
neg_op這個操作符的求反器。
res_proc用於這個操作符的限制選擇度估計函數。
join_proc用於這個操作符的串連選擇度估算函數。
HASHES表示這個操作符可以支援雜湊串連。
MERGES表示這個操作符可以支援歸併串連。
要在 com_op 或者其他選擇性參數中給出一個模式限定的操作符名稱, 請使用OPERATOR()文法,例如:
COMMUTATOR = OPERATOR(myschema.===) ,樣本
為資料類型box定義了一種新的操作符--面積相等:
CREATE OPERATOR === (
LEFTARG = box,
RIGHTARG = box,
FUNCTION = area_equal_function,
COMMUTATOR = ===,
NEGATOR = !==,
RESTRICT = area_restriction_function,
JOIN = area_join_function,
HASHES, MERGES
);