\dxコマンドでインストール済み拡張機能を確認する

PostgreSQLでインストール済みの拡張機能の一覧を確認するには、psqlコマンドラインツールの\dxコマンドを使う。

testdb=# \dx
                  List of installed extensions
   Name   | Version |   Schema   |         Description
----------+---------+------------+------------------------------
 pgcrypto | 1.3     | public     | cryptographic functions
 plpgsql  | 1.0     | pg_catalog | PL/pgSQL procedural language
(2 rows)

plpgsqlはほとんどの環境で標準的にインストール済みの手続き言語拡張である。pgcryptoのようにCREATE EXTENSIONで明示的に追加した拡張機能も同じ一覧に並ぶ。

\dx+で拡張機能に含まれるオブジェクトを確認する

拡張機能名を指定して+を付けると、その拡張機能が作成した関数や型などのオブジェクト一覧を確認できる。

testdb=# \dx+ pgcrypto
            Objects in extension "pgcrypto"
                  Object description
-------------------------------------------------------
 function armor(bytea)
 function armor(bytea,text[],text[])
 function crypt(text,text)
 ...
 function pgp_sym_encrypt_bytea(bytea,text,text)
 function public.gen_random_uuid()
(36 rows)

拡張機能をアンインストール(DROP EXTENSION)する前に、どの関数が一緒に削除されるかを確認する際に使う。

参考: 【PostgreSQL】関数一覧を確認する

pg_extensionとpg_available_extensionsの違い

\dxは内部的にpg_extensionシステムカタログを参照している。SQLで同じ情報を取得する場合はpg_extensionを使う。

testdb=# SELECT extname, extversion FROM pg_extension WHERE extname != 'plpgsql';
 extname  | extversion
----------+------------
 pgcrypto | 1.3
(1 row)

pg_extensionにはこのデータベースへ実際にインストール済みの拡張機能だけが登録される。サーバーにインストールされているがまだ有効化していない拡張機能も含めて確認したい場合はpg_available_extensionsを使う。

testdb=# SELECT name, default_version, installed_version
testdb-# FROM pg_available_extensions
testdb-# WHERE name = 'pgcrypto';
   name   | default_version | installed_version
----------+-----------------+--------------------
 pgcrypto | 1.3             | 1.3
(1 row)

installed_versionNULLの場合はまだCREATE EXTENSIONされていない拡張機能である。サーバー全体で利用可能な拡張機能の数はデータベースへのインストール状況とは無関係に多い。

testdb=# SELECT count(*) FROM pg_available_extensions;
 count
-------
    56
(1 row)

このサーバーには56種類の拡張機能がインストール可能な状態で用意されているが、実際にこのデータベースで有効化されているのはpgcryptoplpgsqlの2つだけである。

\dLコマンドで手続き言語一覧を確認する

CREATE FUNCTION ... LANGUAGEに指定できる手続き言語の一覧は\dLで確認する。

testdb=# \dL
                    List of languages
  Name   | Owner | Trusted |         Description
---------+-------+---------+------------------------------
 plpgsql | postgres   | t       | PL/pgSQL procedural language
(1 row)

Trustedtの言語は、特別な権限を持たない一般ユーザーでもその言語で関数を作成できる。plpython3uのような信頼されていない(Untrusted、名前の末尾がu)言語は、スーパーユーザーまたは専用のロールへの所属が必要になる。

plpgsql自体も実体はpg_languageカタログに登録された拡張機能の一種であり、\dxの一覧にも\dLの一覧にも両方現れる。

参考