昨日の最後に触れた件です。PostgreSQL本体に付属するcontrib(様々な拡張モジュール)を、昨日と同じポータブルなMSYS2 + MinGW-w64で一括ビルド。さらにDBCREATE EXTENSIONで一括インストールできるか試し、問題なくできました。


別途パッケージやライブラリの準備は不要でした。ただしPL/Perlなど組み込み言語拡張は昨日のconfigure時に省いたので、今日は対象外。以下作業経過で、まず本体をビルドした所から1つ下のcontribフォルダに降りてmake、make install。
$ cd POSTGRES_SOURCE/contrib
$ make
$ make install


make installは、昨日と違って環境変数DESTDIRを設定せず普通に実行しました。というのも
昨日の結果から、DESTDIRがなくてもpgsql以下にまとめてインストールされると分かり、MSYS2環境の外に移す(ポータブル化)のが簡単なので。

↓ その様子。左上がPostgreSQL本体のフォルダ、右下がいまmake installしてMSYS2usr/local/pgsqlにできたバイナリ等です。とりあえず後者をフォルダごと本体にコピーし、依存ライブラリ等の追加なく使えるか試しました(結果その通り)。


昨日ビルドしたPostgreSQL 9.5.3を起動
(昨日と同様にpg_ctlでアドホックに)、続いてpsqlを起動しDBに接続。ただし昨日のようにpg_ctlと同じコマンドプロンプトでpsqlを立ち上げると「上カーソルでコマンド履歴」が無効になってしまったので、別のDOS窓で。contribテスト用に適当なDBを作り、そこに移動して進めます。

まずcontribの全拡張の把握に、EXTENSIONインストールに必要なcontrolファイルを使います。psqlからシェルコマンドでshare/extension下を一覧。↓
contrib_test=# \! dir \pgsql\share\extension\*.control
 Volume in drive R has no label.
 Volume Serial Number is 0000-48AE

 Directory of R:\pgsql\share\extension

Jul 14  18:13    176 adminpack.control
Jul 14  18:13    149 autoinc.control
Jul 14  18:13    160 btree_gin.control
Jul 14  18:13    163 btree_gist.control
Jul 14  18:13    150 chkpass.control
Jul 14  18:13    158 citext.control
Jul 14  18:13    142 cube.control
Jul 14  18:13    170 dblink.control
Jul 14  18:13    158 dict_int.control
Jul 14  18:13    179 dict_xsyn.control
Jul 14  18:13    202 earthdistance.control
Jul 14  18:13    155 file_fdw.control
Jul 14  18:13    175 fuzzystrmatch.control
Jul 14  18:13    158 hstore.control
Jul 14  18:13    170 insert_username.control
Jul 14  18:13    119 intagg.control
Jul 14  18:13    176 intarray.control
Jul 14  18:13    160 isn.control
Jul 14  18:13    126 lo.control
Jul 14  18:13    155 ltree.control
Jul 14  18:13    165 moddatetime.control
Jul 14  18:13    173 pageinspect.control
Jul 14  18:13    137 pgcrypto.control
Jul 14  18:13    152 pgrowlocks.control
Jul 14  18:13    147 pgstattuple.control
Jul 14  18:13    157 pg_buffercache.control
Jul 14  18:13    160 pg_freespacemap.control
Jul 14  18:13    139 pg_prewarm.control
Jul 14  18:13    191 pg_stat_statements.control
Jul 14  18:13    177 pg_trgm.control
Jul 12  22:37    179 plpgsql.control
Jul 14  18:13    172 postgres_fdw.control
Jul 14  18:13    169 refint.control
Jul 14  18:13    172 seg.control
Jul 14  18:13    174 tablefunc.control
Jul 14  18:13    134 tcn.control
Jul 14  18:13    156 timetravel.control
Jul 14  18:13    313 tsearch2.control
Jul 14  18:13    186 tsm_system_rows.control
Jul 14  18:13    192 tsm_system_time.control
Jul 14  18:13    157 unaccent.control
Jul 14  18:13    208 xml2.control
              42 File(s)          7,011 bytes
               0 Dir(s)   2,651,619,328 bytes free 


controlファイルの拡張子以外がそのままEXTENSION名なので、上の結果から全拡張の一括CREATE EXTENSIONファイルを作ります。Unix環境ならパイプでsed等に渡して置換するところ、今日はコマンドプロンプトなのでエディタにコピーして置換。

↓ できたSQLファイルの中身。(create_extensions_contrib.sql)
create extension adminpack;
create extension autoinc;
create extension btree_gin;
create extension btree_gist;
create extension chkpass;
create extension citext;
create extension cube;
create extension dblink;
create extension dict_int;
create extension dict_xsyn;
create extension earthdistance;
create extension file_fdw;
create extension fuzzystrmatch;
create extension hstore;
create extension insert_username;
create extension intagg;
create extension intarray;
create extension isn;
create extension lo;
create extension ltree;
create extension moddatetime;
create extension pageinspect;
create extension pgcrypto;
create extension pgrowlocks;
create extension pgstattuple;
create extension pg_buffercache;
create extension pg_freespacemap;
create extension pg_prewarm;
create extension pg_stat_statements;
create extension pg_trgm;
create extension plpgsql;
create extension postgres_fdw;
create extension refint;
create extension seg;
create extension tablefunc;
create extension tcn;
create extension timetravel;
create extension tsearch2;
create extension tsm_system_rows;
create extension tsm_system_time;
create extension unaccent;
create extension xml2;


psqlのメタコマンド\iで読み込み実行すると ↓warning一つ、ERROR一つ(plpgsqlが既にあり)で済み、実質すべてインストールできました。
# \i r:/create_extensions_contrib.sql
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
psql:r:/create_extensions_contrib.sql:5: WARNING:  type input function chkpass_i
n should not be volatile
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
psql:r:/create_extensions_contrib.sql:31: ERROR:  extension "plpgsql" already ex
ists
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION


インストールされたEXTENSIONは、psqlのメタコマンド\dxで簡単に一覧できます。今回はコマンドプロンプトで横幅を広げるのが面倒なので、ファイルに出力しました。↓
# \pset border 2
# \o r:/dx_output.txt
# \dx
# \o

-- r:/dx_output.txt
                                             インストール済みの拡張の一覧
+--------------------+------------+------------+----------------------------------------------------------------------+
|        名前        | バージョン |  スキーマ  |                                 説明                                 |
+--------------------+------------+------------+----------------------------------------------------------------------+
| adminpack          | 1.0        | pg_catalog | administrative functions for PostgreSQL                              |
| autoinc            | 1.0        | public     | functions for autoincrementing fields                                |
| btree_gin          | 1.0        | public     | support for indexing common datatypes in GIN                         |
| btree_gist         | 1.1        | public     | support for indexing common datatypes in GiST                        |
| chkpass            | 1.0        | public     | data type for auto-encrypted passwords                               |
| citext             | 1.1        | public     | data type for case-insensitive character strings                     |
| cube               | 1.0        | public     | data type for multidimensional cubes                                 |
| dblink             | 1.1        | public     | connect to other PostgreSQL databases from within a database         |
| dict_int           | 1.0        | public     | text search dictionary template for integers                         |
| dict_xsyn          | 1.0        | public     | text search dictionary template for extended synonym processing      |
| earthdistance      | 1.0        | public     | calculate great-circle distances on the surface of the Earth         |
| file_fdw           | 1.0        | public     | foreign-data wrapper for flat file access                            |
| fuzzystrmatch      | 1.0        | public     | determine similarities and distance between strings                  |
| hstore             | 1.3        | public     | data type for storing sets of (key, value) pairs                     |
| insert_username    | 1.0        | public     | functions for tracking who changed a table                           |
| intagg             | 1.0        | public     | integer aggregator and enumerator (obsolete)                         |
| intarray           | 1.0        | public     | functions, operators, and index support for 1-D arrays of integers   |
| isn                | 1.0        | public     | data types for international product numbering standards             |
| lo                 | 1.0        | public     | Large Object maintenance                                             |
| ltree              | 1.0        | public     | data type for hierarchical tree-like structures                      |
| moddatetime        | 1.0        | public     | functions for tracking last modification time                        |
| pageinspect        | 1.3        | public     | inspect the contents of database pages at a low level                |
| pg_buffercache     | 1.1        | public     | examine the shared buffer cache                                      |
| pg_freespacemap    | 1.0        | public     | examine the free space map (FSM)                                     |
| pg_prewarm         | 1.0        | public     | prewarm relation data                                                |
| pg_stat_statements | 1.3        | public     | track execution statistics of all SQL statements executed            |
| pg_trgm            | 1.1        | public     | text similarity measurement and index searching based on trigrams    |
| pgcrypto           | 1.2        | public     | cryptographic functions                                              |
| pgrowlocks         | 1.1        | public     | show row-level locking information                                   |
| pgstattuple        | 1.3        | public     | show tuple-level statistics                                          |
| plpgsql            | 1.0        | pg_catalog | PL/pgSQL procedural language                                         |
| postgres_fdw       | 1.0        | public     | foreign-data wrapper for remote PostgreSQL servers                   |
| refint             | 1.0        | public     | functions for implementing referential integrity (obsolete)          |
| seg                | 1.0        | public     | data type for representing line segments or floating-point intervals |
| tablefunc          | 1.0        | public     | functions that manipulate whole tables, including crosstab           |
| tcn                | 1.0        | public     | Triggered change notifications                                       |
| timetravel         | 1.0        | public     | functions for implementing time travel                               |
| tsearch2           | 1.0        | public     | compatibility package for pre-8.3 text search functions              |
| tsm_system_rows    | 1.0        | public     | TABLESAMPLE method which accepts number of rows as a limit           |
| tsm_system_time    | 1.0        | public     | TABLESAMPLE method which accepts time in milliseconds as a limit     |
| unaccent           | 1.0        | public     | text search dictionary that removes accents                          |
| xml2               | 1.0        | public     | XPath querying and XSLT                                              |
+--------------------+------------+------------+----------------------------------------------------------------------+
(42 行)


実際は一つのDBでこんなに拡張を使いませんが、テストということで。今後、各拡張を使ってみて何か問題が起きたら(ライブラリが足りない等)追記します。

最後に、作業終了時のポータブルなPostgreSQLフォルダ(実行用ファイルとデータのみ。ソースは含まず)のサイズは122MBで ↓ かなりコンパクトです。