CREATE OPERATOR name ( PROCEDURE = func_name [, LEFTARG = type1 ] [, RIGHTARG = type2 ] [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ] [, RESTRICT = res_proc ] [, JOIN = join_proc ] [, HASHES ] [, SORT1 = left_sort_op ] [, SORT2 = right_sort_op ] )
定義される演算子です。有効な文字については下記を参照して 下さい。
この演算子を実装するために使用される関数です。
もしあれば、演算子の左側の型です。このオプションは右単項演算子 では省略されます。
もしあれば、演算子の右側の型です。このオプションは左単項演算子 では省略されます。
この演算子に対する交代演算子です。
この演算子に対する否定演算子です。
この演算子に対する制限選択評価関数です。
この演算子に対する結合選択評価関数です。
この演算子がハッシュ結合アルゴリズムをサポートすることを 示します。
この演算子の左側のデータ型で整列させる演算子です。
この演算子の右側のデータ型で整列させる演算子です。
CREATE OPERATOR は新しい演算子、 name を 定義します。 オペレータを定義したユーザはその所有者となります。
演算子 name は 以下の中からどんな組合せでも構わない 32 文字までの文字列です。
+ - * / < > = ~ ! @ # % ^ & | ` ? $ :
Note: 演算子の名前にはアルファベット文字が使えません。 そうすることで、Postgres が SQL 入力をトークンにトークン間にスペースを挿入せず、 解析することを可能にします。
演算子 "!=" は入力の際 "<>" に射影されますので、二つは 等価です。
少なくとも LEFTARG と RIGHTARG のうち一つを定義しなければ なりません。二項演算子の場合、二つとも定義しなければ なりません。右単項演算子の場合、LEFTARG だけが定義され、一方 左単項演算子の場合は RIGHTARG だけが定義されなければなりません。
同時に、func_name プロシージャは前もって CREATE FUNCTION により 定義され、且つ(一つまたは二つの)正しい数の引数を受け入れるように 定義されていなければなりません。
Postgres が、必要な場合 演算項目の順序を逆さまに辿れるようにするため、 交代演算子が存在する場合には、それに相違ないことを 確認する必要があります。 例えば、演算子 area-less-than, <<< は 交代演算子 area-greater-than, >>> を持っていて 問合せオプティマイザは自由に変換することが出来ます。
"0,0,1,1"::box >>> MYBOXES.descriptionを
MYBOXES.description <<< "0,0,1,1"::boxに変換します。
これにより、実行コードが常に後者の表現形式を使用することが 出来るようにし、問合せオプティマイザを何がしか単純化します。
同様にして、否定演算子が存在するときはその確認がなされ なければなりません。 演算子 area-equal, ===, が存在し、area が !== に等しくない 場合を想定します。 否定演算子のリンクは問合せオプティマイザが
NOT MYBOXES.description === "0,0,1,1"::boxから
MYBOXES.description !== "0,0,1,1"::boxに単純化することを許可します。
交代演算子の名前が与えられている場合、 Postgres は交代演算子を カタログ内で検索します。 検出され、なお交代そのものを自身が所持していない場合 には、交代の項目が、その交代として、新たに作成された演算子 を所有するように更新されます。 このことは否定演算子にも同様に適用されます。
このことにより、それぞれが交代演算子または否定演算子である 二つの演算子を定義することが可能となります。第一の演算子 は(適切な処理として)交代演算子または否定演算子なしで定義 される必要があります。第二の演算子が定義されるとき、第一 の演算子を交代演算子または否定演算子と指定します。 初めの演算子は副作用により更新されることになります。 (Postgres 6.5 時点で、それぞれを参照する二つの演算子を 持つことが有効となっています。)
問合せオプティマイザが結合を実行するのをサポートするため、 以下の三つの仕様が提供されています。 Postgres は常に反復した変換 [WONG76] (つまり、ブール値を返す演算子によって分離された二つのタプル 変数を持つ句を処理すること)により結合を評価します。 このほかに、Postgres はハッシュ・結合 [SHAP86] にしたがったアルゴリズムを使用することができます。 といっても、この戦略が適用できるかどうかを知る必要があります。 現在のハッシュ・結合アルゴリズムは等価性の評価を示す演算子のみ にたいして有効です。さらに、データ型の等価性は、型の表現形式 がビット単位で整合していることを意味していなければなりません。 (例えば、等価性の評価に関係のない使われないビットを含んでいる データ型はハッシュ・結合されません。) HASHES のフラグは問合せオプティマイザにたいし、ハッシュ結合 がこの演算子で安全に使用できることを示します。
同様にして、二つの整列演算子は問合せオプティマイザにたいし、 マージ・整列が結合戦略で有効かどうか、そしてどちらの演算子が 二つの演算項目クラスにたいして使用されるのかを示します。 整列演算子は等価演算子にたいしてのみ提供され、それぞれが右側と 左側のデータ型に対する less-than 演算子を参照しなければなり ません。
もし、他の結合戦略が実用的であった場合、 Postgres はその戦略を使用する ようにオプティマイザと実行時システムを変更し、ある演算子 が定義されたとき追加の仕様を求めることになります。 幸運なことに、研究団体がときたま新しい結合戦略を発明する ことがあって、付加されたユーザ定義の結合戦略の一般性は、 内包する複雑性にかかわらず、その価値が認められています。
最後の二つの仕様によって問合せオプティマイザは結果の大きさを 推測できます。 もし、形状の句
MYBOXES.description <<< "0,0,1,1"::boxが条件の中にあれば、Postgres は この句を満足する MYBOXES にあるインスタンスの割合を推測 します。関数 res_proc は登録された(前もって CREATE FUNCTION に より定義された)関数で、正しいデータ型の引数を受けつけ、 そして浮動小数点の数値を返すものです。問合せオプティマイザは、 望ましい、そして期待されるインスタンスの数を取得するために、 単にこの関数を呼び出し、パラメータ "0,0,1,1" を引き渡して、 結果をリレーションの大きさで掛け算します。
同様、演算子の演算項目が二つともインスタンス変数を所有して いる場合、問合せオプティマイザは結果となる結合の大きさを推測 しなければなりません。関数 join_proc は望ましい期待される結果 の大きさを計算するために関係する二つのクラスの基数によって乗算 された別の浮動小数点数値を返します。
関数
my_procedure_1 (MYBOXES.description, "0,0,1,1"::box)とその演算子
MYBOXES.description === "0,0,1,1"::boxとの相違は Postgres が 演算子を最適化しようとし、演算子がかかわっている場合 検索空間を制限するためにインデックスの使用を決定 できることです。とはいっても、関数を最適化することは せず、強制的に実行されます。更には、演算子は一つまたは 二つまでと引数の数が制限されているにかかわらず、関数は どんな数の引数でも取ることが出来ます。