第 33章SQL の拡張

目次
33.1. 拡張の作用法
33.2. PostgreSQLの型システム
33.2.1. 基本型
33.2.2. 複合型
33.2.3. ドメイン
33.2.4. 疑似型
33.2.5. 多様型
33.3. ユーザ定義関数
33.4. 問い合わせ言語 (SQL) 関数
33.4.1. 基本型を使用するSQL関数
33.4.2. 複合型を使用するSQL関数
33.4.3. テーブルソースとしてのSQL関数
33.4.4. 集合を返すSQL関数
33.4.5. 多様SQL関数
33.5. 手続き型言語関数
33.6. 内部関数
33.7. C言語関数
33.7.1. 動的ロード
33.7.2. C言語関数における基本型
33.7.3. C言語関数のためのVersion-0呼び出し規約
33.7.4. C言語関数のためのVersion-1呼び出し規約
33.7.5. コードの作成
33.7.6. 動的にロードされる関数のコンパイルとリンク
33.7.7. C言語関数における複合型引数
33.7.8. C言語関数から行(複合型)を返す
33.7.9. C言語関数から集合を返す
33.7.10. 引数と戻り値の多様性
33.8. 関数のオーバーロード
33.9. ユーザ定義の集約
33.10. ユーザ定義の型
33.11. ユーザ定義の演算子
33.12. 演算子最適化に関する情報
33.12.1. COMMUTATOR
33.12.2. NEGATOR
33.12.3. RESTRICT
33.12.4. JOIN
33.12.5. HASHES
33.12.6. MERGES (SORT1, SORT2, LTCMP, GTCMP)
33.13. インデックス拡張機能へのインタフェース
33.13.1. インデックスメソッドとオペレータクラス
33.13.2. インデックスメソッドのストラテジ
33.13.3. インデックスメソッドのサポートルーチン
33.13.4.
33.13.5. システムの演算子クラスに対する依存性
33.13.6. 演算子クラスの特殊な機能

本節では、PostgreSQLSQL問い合わせ言語を、以下のようなもの追加することで、どのように拡張できるかを説明します。

33.1. 拡張の作用法

PostgreSQLは、自分自身の操作がカタログに定義された方法で駆動されているため拡張が可能です。 もし標準のリレーショナルデータベースシステムに慣れ親しんでいるのであれば、システムカタログと呼ばれるものの中に、データベース、テーブル、列などの情報が格納されていることは知っていると思います。 (システムによってはデータディクショナリと呼ぶものもあります。) このカタログは、ユーザの目には他のテーブルと同じように見えますが、DBMSは内部情報をそこに格納しているのです。 PostgreSQLと標準のリレーショナルデータベースシステムの重要な違いは、PostgreSQLはカタログにより多くの情報を格納するということです。 テーブルと列に関する情報だけではなく、データ型、関数、アクセスメソッドなどの情報も格納されています。 これらのテーブルはユーザが変更できます。 そして、PostgreSQLは操作をこれらのテーブルに基づいて行うので、PostgreSQLはユーザによって拡張することができるのです。 それに対して一般のデータベースシステムでは、ソースコード内にハードコーディングされたプロシージャを変えるか、DBMSベンダによって特別に書かれたモジュールをロードしなければ拡張することができません。

更にPostgreSQLサーバは動的ローディングによってユーザの作成したコードを取り入れることができます。 つまり、ユーザが新しい型か関数を実装するオブジェクトコードファイル(たとえば共有ライブラリ)を指定することができ、PostgreSQLは要求されたとおりにロードするのです。 SQLで作成されたコードをサーバに追加するのはさらに簡単です。 このように演算を"その場で"変えることができるためPostgreSQLは新しいアプリケーションや格納構造体のラピットプロトタイピングに適しています。