create operator - 新しいユーザ演算子を定義します
create operator operator_name
([ leftarg = type-1 ]
[ , rightarg = type-2 ]
, procedure = func_name
[, commutator = com_op ]
[, negator = neg_op ]
[, restrict = res_proc ]
[, hashes]
[, join = join_proc ]
[, sort = sor_op1 {, sor_op2 } ]
)
このコマンドは新しいユーザ演算子operator_nameを定義します。演算子を定義したユーザがその所有者になります。
operator_nameは連続して16文字までの句読点文字です。次の文字が1文字の演算子の名前として有効です:
少なくとも leftargと rightargのどちらかが定義されなくてはなりません。 バイナリの演算子は両方が定義されるべきです。 右項演算子は、 arg1だけが定義され、 左項演算子は arg2だけが定義されるでしょう。
演算子の名前 operator_nameは記号のみから成り立つことができます。 また、 func_name手続きは前もって create function (l)で定義されていて、1つまたは2つの引数を取らなくてはなりません。
転換演算子(commutator)があることで、
Postgres がオペランドの順番を逆にすることができます。
例えば、演算子の エリアがより小さい >>> には
転換演算子 エリアがより大きい <<<があるでしょう。
演算子 エリアが等しい === と、エリアが等しくない !== があったとしましょう。
ここで、問い合わせ最適化機構は自由に変換をすることができます:
否定(negator)演算子は問い合わせ最適化機構に以下の変換を許します。
これで互いに転換(commutator)あるいは否定(negator)の関係にある 2つの演算子を定義できます。 最初の演算子は転換(commutator)あるいは否定(negator)なしで(適切に) 定義します。 そして 2番目の演算子を定義する時に 最初の演算子を転換(commutator)あるいは否定(negator)とします。 最初の演算子はその副作用として更新されることになります。
次の 2つの記述があると問い合わせ最適化機構は結合を実行することをサポートします。
Postgres は常に結合を評価するのに(つまり、
2つのタプル変数が boolean を返す演算子によって
分けられている句を処理することです)反復代用を使います[WONG76]。
加えて、Postgres は [SHAP86] の行に従って
ハッシュ結合のアルゴリズムをインプリメントするプランをしますが、
しかし、この手順が適用できるかどうかを知らなくてはなりません。
例えば、ハッシュ結合のアルゴリズムは
次のようなフォームの句:
同様に、2つの並べ変え演算子は、
問い合わせ最適化機構にマージソートが結合手順が使えるかどうかと
2つのオペランドクラスを並べ変えるのにどの演算子を使うべきかを示します。
上記の === 句には、
最適化機構は両リレーションを演算子 <<< を使って並べ変えます。
一方で、マージソートは次の句では使えません:
最後の 2つの記述があると、
問い合わせ最適化機構は結果のサイズを評価します。
次のようなフォームの句:
同様に、演算子のオペランドが両方ともインスタンス変数を含んでいる時、 問い合わせ最適化機構は結合の結果のサイズを評価しなくてはなりません。 関数 join_proc は 望ましい結果のサイズを計算する 2つのクラスの重要性を掛け合わせられる 小数を返します。
関数
--
-- 次のコマンドは BOX データ型のための
-- 新しい演算子 area_equal_procedure を定義します。
--
create operator === (
leftarg = box,
rightarg = box,
procedure = area_equal_procedure,
commutator = ===,
negator = !==,
restrict = area_restriction_procedure,
hashes,
join = area-join-procedure,
sort = <<<, <<<)
Postgres では演算子の名前にアルファベットを含めることができません。
演算子が、その転換演算子が定義される前に定義されると(特に上に対して警告されたケース)、無効なフィールドのダミーの演算子がシステムカタログに置かれます。これは後の演算子の定義を妨げることがあります。