全部產品
Search
文件中心

PolarDB:ALTER OPERATOR FAMILY

更新時間:Jul 06, 2024

ALTER OPERATOR FAMILY更改一個操作符族的定義。

簡介

你能增加操作符以及支援函數到該家族、從該族中移除它們或者更改該族的名稱或者擁有者。

在用ALTER OPERATOR FAMILY增加操作符和支援函數到一個族中時,它們不是族內任何特定操作符類的組成部分,而只是 “鬆散”地存在於該族中。這表示這些操作符和函數與該族的語義相容,但是沒有被任何特定索引的正確功能所要求(所要求的操作符和函數應該被作為一個操作符類的一部分聲明,見 CREATE OPERATOR CLASS )。 PolarDB將允許一個族的鬆散成員在任何時候被從該族中刪除,但是在刪除一個操作符類的成員之前,必須已經刪除整個類以及依賴於該成員的索引。具有代表性的是,單一資料類型操作符和函數是操作符類的一部分,因為在特定資料類型上的索引需要它們的支援。而多資料類型操作符和函數則被作為該族的鬆散成員。

要使用ALTER OPERATOR FAMILY,你必須是超級使用者( 做這樣的限制是因為一個錯誤的操作符族定義可能會迷惑伺服器甚至讓它崩潰)。

ALTER OPERATOR FAMILY目前不檢測操作符族定義是否包括該索引方法所要求的所有操作符和函數,也不檢查操作符和函數是否形成了一個有理的集合。定義一個合法的操作符族是使用者的責任。

文法

    ALTER OPERATOR FAMILY name USING index_method ADD
      {  OPERATOR strategy_number operator_name ( op_type, op_type )
                  [ FOR SEARCH | FOR ORDER BY sort_family_name ]
       | FUNCTION support_number [ ( op_type [ , op_type ] ) ]
                  function_name [ ( argument_type [, ...] ) ]
      } [, ... ]

    ALTER OPERATOR FAMILY name USING index_method DROP
      {  OPERATOR strategy_number ( op_type [ , op_type ] )
       | FUNCTION support_number ( op_type [ , op_type ] )
      } [, ... ]

    ALTER OPERATOR FAMILY name USING index_method
        RENAME TO new_name

    ALTER OPERATOR FAMILY name USING index_method
        OWNER TO { new_owner | CURRENT_USER | SESSION_USER }

    ALTER OPERATOR FAMILY name USING index_method
        SET SCHEMA new_schema

參數

name一個現有操作符族的名稱(可以是模式限定的)。

index_method這個操作符族所應用的索引方法的名稱。

strategy_number與該操作符族相關的一個操作符的索引方法策略號。

operator_name與該操作符族相關的一個操作符的名稱(可以是模式限定的)。

op_type在一個OPERATOR子句中指定該操作符的運算元資料類型, 或者用NONE來表示一個左一元或者右一元操作符。不同於 CREATE OPERATOR CLASS中類似的文法,運算元資料類型總是必須被指定。

在一個ADD FUNCTION子句中指定該函數意圖支援的運算元資料類型(如果不同於該函數的輸入資料類型)。對於 B-樹比較函數和雜湊函數,有必要指定 op_type,因為該函數的輸入資料類型總是正確的。對於 B 樹排序支援功能,B 樹相等的映像函數以及 GiST,SP-GiST 和 GIN 運算子類中的所有函數,必須指定要與該函數一起使用的運算元資料類型。

在一個DROP FUNCTION子句中,必須指定該函數要支援的運算元資料類型。

sort_family_name一個現有btree操作符族的名稱(可能是模式限定的), 它描述與一個排序操作符相關的排序次序。

如果既沒有指定FOR SEARCH也沒有指定FOR ORDER BY, 預設值是FOR SEARCH

support_number一個與該操作符族相關的函數的索引方法支援過程編號。

function_name作為該操作符族的一種索引方法支援函數的函數名稱(可以是模式限定的)。 如果沒有指定參數列表,則該名稱必須在其模式中唯一。

argument_type該函數的參數資料類型。

new_name該操作符族的新名稱。

new_owner該操作符族的新擁有者。

new_schema該操作符族的新模式。

OPERATORFUNCTION子句可以以任何順序出現。

說明

注意DROP文法只通過策略或者支援號以及輸入資料類型指定該操作符族中的“slot”。佔用這個槽的操作符或函數的名稱不會被提及。 還有,對於DROP FUNCTION,要指定的類型是該函數意圖支援的輸入資料類型。對於 GiST、SP-GiST 以及 GIN 索引,可能無需對該函數的實際輸入參數類型做任何事情。

因為索引機制在使用函數之前不會檢查其上的存取權限,包括一個操作符族中的函數或操作符都等同於授予了其上的公用執行許可權。這對於操作符族中很有用的這類函數來說,這通常不成問題。

操作符應該由 SQL 函數定義。一個 SQL 函數很可能被內聯到調用查詢中,這將阻止最佳化器識別出該查詢匹配一個索引。

樣本

下列樣本命令為一個操作符族增加跨資料類型的操作符和支援函數,該操作符族已經包含用於資料類型int4以及int2的 B-樹操作符類。

    ALTER OPERATOR FAMILY integer_ops USING btree ADD

      -- int4 vs int2
      OPERATOR 1 < (int4, int2) ,
      OPERATOR 2 <= (int4, int2) ,
      OPERATOR 3 = (int4, int2) ,
      OPERATOR 4 >= (int4, int2) ,
      OPERATOR 5 > (int4, int2) ,
      FUNCTION 1 btint42cmp(int4, int2) ,

      -- int2 vs int4
      OPERATOR 1 < (int2, int4) ,
      OPERATOR 2 <= (int2, int4) ,
      OPERATOR 3 = (int2, int4) ,
      OPERATOR 4 >= (int2, int4) ,
      OPERATOR 5 > (int2, int4) ,
      FUNCTION 1 btint24cmp(int2, int4) ;

再次移除這些項:

    ALTER OPERATOR FAMILY integer_ops USING btree DROP

      -- int4 vs int2
      OPERATOR 1 (int4, int2) ,
      OPERATOR 2 (int4, int2) ,
      OPERATOR 3 (int4, int2) ,
      OPERATOR 4 (int4, int2) ,
      OPERATOR 5 (int4, int2) ,
      FUNCTION 1 (int4, int2) ,

      -- int2 vs int4
      OPERATOR 1 (int2, int4) ,
      OPERATOR 2 (int2, int4) ,
      OPERATOR 3 (int2, int4) ,
      OPERATOR 4 (int2, int4) ,
      OPERATOR 5 (int2, int4) ,
      FUNCTION 1 (int2, int4) ;