unknown
コマンドPL/Tclでは、使用時に自動的にTclのコードを読み込む機能があります。
これは、Tclコードのモジュールを含むと仮定されるpltcl_modules
という特殊なテーブルを認識します。
このテーブルが存在する場合、そのテーブルからunknown
モジュールが取り出され、データベースセッション内でPL/Tclが最初に実行される直前にTclインタプリタに読み込まれます。
(セッション内で複数のインタプリタが使用される場合、これは個々のTclインタプリタそれぞれで起こります。42.4. PL/Tclにおけるグローバルデータを参照してください。)
実際、unknown
モジュールには必要な任意の初期化コードを含めることができますが、通常は、そこにTcl 「unknown」プロシージャを定義します。
このプロシージャはTclが呼び出されたプロシージャ名を認識できなかった場合に常に呼び出されます。
このプロシージャのPL/Tcl標準バージョンでは、必要なプロシージャを定義しているpltcl_modules
からのモジュール検索を試みます。
プロシージャが検出された場合、インタプリタに読み込まれ、その後、元々試みられたプロシージャ呼び出しを実行することが許されます。
二次的なpltcl_modfuncs
テーブルは、どの関数がどのモジュールで定義されているかに関するインデックスを提供します。
これにより検索がかなり高速になります。
PostgreSQLの配布には、これらのテーブル管理用のサポートスクリプト、pltcl_loadmod
、pltcl_listmod
およびpltcl_delmod
が含まれています。
同様に標準のunknown
モジュールのソースがshare/unknown.pltcl
に含まれています。
自動読み込み機構をサポートさせるためには、あらかじめ各データベースにこのモジュールを読み込ませる必要があります。
pltcl_modules
およびpltcl_modfuncs
テーブルは全ユーザから読み取り可能でなければなりません。
しかし、その所有者をデータベース管理者とし、データベース管理者のみが書き込み可能とする方が良いでしょう。
セキュリティ対策としてPL/Tclはpltcl_modules
をスーパーユーザが所有していない限りそれを無視します(このためunknown
モジュールの読み込みを行いません)。
しかし、十分信頼できるのであればこのテーブル上の更新権限を他のユーザに付与することができます。