PostgreSQLステートメントのリストを取得します

イントロ



ああ、長い間チェッカーを拾いませんでした。 しかし、何もする必要はありません。私は夕方まで奇妙な都市に閉じ込められていました。唯一の慰めは地元のピザ屋のノンアルコールビールです。 したがって、少し時間をつぶすために、フロントエンド(フロントエンド)の単純な問題をどのように解決したかについての記事を書きます。



彼らは現在、とりわけ、返されたデータのフィルター用のエディターがあるインターフェースを作成しています。 それが彼らが私に尋ねた理由です:

比較演算子として標準の"<,>,!=,="



を使用するだけで十分ですか? または、追加する価値のある演算子はありますか?


「いいえ、十分ではない」私は彼らに答えた。 -PostgreSQLはそのままで演算子の暗闇をサポートしているだけでなく、自分で定義することもできます。さらに、各拡張機能はシステムにさらに多くを追加するよう努めています。



私の答えは彼らを困惑させました。 そして、誰かが困惑したとき、彼は隣人を困惑させて喜んでいるでしょう。 そして彼らは(少なくとも議論の余地のない権威として)私に、少なくとも裸で新鮮なシステムの場合には、演算子のリストをまとめるように頼んだ。



しかし、結婚したのはこれが初めてではなく、バニラ象のバージョンの違いから始まり、PostgresPro、CitusDBなどのフォークで終わるシステムが異なることはわかっています。 まあ、そして第二に、これらの同じ人は明日表示するために利用可能な演算子のリストを取得したいと思うでしょう、それでも私はまだこの問題を解決しなければなりません。 したがって、このテキストは私の考えの連続です。



問題の声明



  1. フィルターにのみ演算子が必要です。したがって、演算子を適用した結果はboolean



    型になります
  2. バイナリまたは単項については何も言われていないため、すべてを取り上げます。


解決策



私の最初の欲求は、 マニュアルに登り、そこから主要なオペレーターのリストを素早く引き出すことでした。 怠zyでアスレチックではありません。



次に、このテーマのソースをスクロールするというアイデアを訪れました。 これは/src/include/catalog/pg_operator.hにあります。 当然、思考は森にも行きました。 サーバーのシステムディレクトリを掘り下げるので、SQLを使用してこれを行う方が便利です。



ピッツェリアはPostgresサーバーを上げていませんでしたが、彼らが言うように、私はそれを持っていました。 お持ちでない場合は、すばらしいSQL Fiddleサービスでこれらの実験を行うことができます。



そのため、演算子に関する情報はpg_operator



システムディレクトリに格納されるため、最初の反復を想定するのが論理的です



 SELECT * FROM pg_operator;
      
      





素のPostgreSQL 9.6で772行を受け取り、同じSQL Fiddle(PostgreSQL 9.3)で、クエリは823行を返しました。 そのような広がりはあなたを驚かせるべきではありません。 「箱から出して」の2番目のケースでは、追加の8つの拡張機能がインストールされていることが判明しました。



 SELECT extname FROM pg_extension;
      
      





 | extname | |---------------| | plpgsql | | fuzzystrmatch | | hstore | | intagg | | intarray | | ltree | | pg_trgm | | uuid-ossp | | xml2 |
      
      





最初のアプローチ



ここで、結果をboolean



を返す演算子に制限します。



 SELECT * FROM pg_operator WHERE oprresult = 'boolean'::regtype; --------------- Record Count: 513; (local 9.6) Record Count: 552; (SQL Fiddle 9.3)
      
      









この特別なストリートマジックを見てみましょう。 oprresult



フィールドはoid型で、内部的に4バイトの符号なし整数型を表します。 ブール値のoidが16であることを覚えておくために、良い方法では数値と​​比較する必要がありますが、私のようなすべてのオタクではありません。したがって、ここではregtype



タイプregtype



と型キャストを使用しました。 非常に便利な小さなもの。 採用することをお勧めします。



切ります



お気づきのとおり、同じ演算子を異なるタイプの引数に使用できます。 合計で重複は必要ないので、重複を削除し、結論をより意味のあるものにしようとします。



 SELECT oprname, count(1), array_agg(DISTINCT oprleft::regtype) AS left_args, array_agg(DISTINCT oprright::regtype) AS right_args, array_agg(DISTINCT obj_description(oid, 'pg_operator')) AS comments FROM pg_operator WHERE oprresult = 'boolean'::regtype GROUP BY oprname ORDER BY count(1) DESC; --------------- Record Count: 58; (local 9.6) Record Count: 62; (SQL Fiddle 9.3)
      
      









合計



PostgreSQLでわかるように、ブール型を返し、フィルターを構築するのに適した約60の異なる(sic!)演算子です。 PostgreSQLには柔軟なタイピングシステムがあることを思い出すと、この多様性は簡単に説明できます。 したがって、多くの追加の演算子は、ユーザータイプを使用した作業を容易にするように設計されています。 そして、その数は間違いなく増加するだけです。



All Articles