PostgreSQL 9.3 beta1 を動かしてみた

9.3 beta1を発見

数日前に「そろそろ出るよ〜」と聞いていたのだが、今朝、何気なく本家のDLページを見たらPostgreSQL 9.3-beta1のアーカイブが転がっていたので、早速試してみることにした。

インストールまで

とりあえず手元のCentOS上に入れて、configure(--with-libxmlつき), make, make install, make checkをかけておく。ここまでは特に問題はなし。

次作EXTENSIONの動作確認

新機能の確認は週末にしよう・・・。
とりあえず、自作のEXTENSIONが9.3でもそのまま動作するかどうかを確認してみる。

関数字型ksj

make, make installまではOK。しかし、checkでfailedになる・・・(´・ω・`)

[nuko@localhost ksj]$ make USE_PGXS=1 check
"make check" is not supported.
Do "make install", then "make installcheck" instead.
[nuko@localhost ksj]$ make USE_PGXS=1 installcheck
/home/harada/pgsql-9.3-b1/lib/pgxs/src/makefiles/../../src/test/regress/pg_regress --inputdir=. --psqldir='/home/harada/pgsql-9.3-b1/bin'   --dbname=contrib_regression ksj
(using postmaster on Unix socket, default port)
============== dropping database "contrib_regression" ==============
NOTICE:  database "contrib_regression" does not exist, skipping
DROP DATABASE
============== creating database "contrib_regression" ==============
CREATE DATABASE
ALTER DATABASE
============== running regression test queries        ==============
test ksj                      ... FAILED

======================
 1 of 1 tests failed. 
======================

The differences that caused some tests to fail can be viewed in the
file "/home/harada/src/ksj/regression.diffs".  A copy of the test summary that you see
above is saved in the file "/home/harada/src/ksj/regression.out".

make: *** [installcheck] エラー 1
[nuko@localhost ksj]$ 

なにが動かなかったのだろう?と思い、expectedとresultのdiffを見てみると・・・

[nuko@localhost ksj]$ diff expected/ksj.out results/ksj.out 
186d185
< 
[nuko@localhost ksj]$ 

で、それぞれのファイルの該当箇所を見てみると・・・

expected

CREATE INDEX ksj_idx ON ksj_sample (data);

TRUNCATE TABLE ksj_sample;

result

CREATE INDEX ksj_idx ON ksj_sample (data);
TRUNCATE TABLE ksj_sample;

どうやら、CRETAE INDEXが正常終了したときに、9.2までは空行を出力していたのが、9.3からは出力されなくなっているようだ。
他のCREATE系コマンドの出力と統一したってことかな。
まあ、とりあえず関数字型の機能そのものについては9.3でも正常に動作することがわかった。

neo4j_fdw

こっちはリグレッションテストは作成していないが、テスト用のスクリプトがあるので、それを動作させてみた(Neo4jのバージョンは1.9M05のまま。こっちも2.0Mに上げておかないとな・・・)。

[nuko@localhost test]$ ./test.sh 
neo4j_fdw demo start
neo4j_fdwの登録とFOREIGN SERVERの生成
CREATE EXTENSION neo4j_fdw;
CREATE EXTENSION
CREATE SERVER foo
    FOREIGN DATA WRAPPER neo4j_fdw
    OPTIONS (url 'http://localhost:7474/db/data/cypher');
CREATE SERVER
データベース内の全ノードのプロパティ name,gender,locationの検索

CREATE FOREIGN TABLE bar1 (
    name text,
    gender text,
    location text)
    SERVER foo
    OPTIONS (query '{"query":"START n=node(*) RETURN n.name as name, n.gender? as gender, n.location? as locatoin " }');
CREATE FOREIGN TABLE
Null display is "(null)".
SELECT name, gender, location FROM bar1;
 name | gender | location 
------+--------+----------
 大和 | Male   | 奈良県
 武蔵 | Male   | 東京都
 長門 | Male   | 山口県
 陸奥 | Male   | (null)
 伊勢 | (null) | 三重県
 日向 | (null) | 宮崎県
 赤城 | Famale | 東京都
 加賀 | Famale | (null)
 信濃 | Famale | (null)
 飛龍 | Famale | (null)
 蒼龍 | Famale | (null)
(11 rows)

SELECT name, gender FROM bar1 WHERE location = '東京都';
 name | gender 
------+--------
 武蔵 | Male
 赤城 | Famale
(2 rows)

各ユーザをフォローしている人一覧/人数

CREATE FOREIGN TABLE bar2 (
    name text,
    follower_name text,
    follower_gender text)
    SERVER foo
    OPTIONS (query '{"query":"START n=node(*) MATCH p=n< -[:follow]-fm RETURN n.name as name , fm.name  as follower_name, fm.gender? as follower_gender " }');
CREATE FOREIGN TABLE
Null display is "(null)".
SELECT name, follower_name, follower_gender FROM bar2;
 name | follower_name | follower_gender 
------+---------------+-----------------
 大和 | 武蔵          | Male
 大和 | 信濃          | Famale
 大和 | 長門          | Male
 武蔵 | 信濃          | Famale
 武蔵 | 大和          | Male
 長門 | 大和          | Male
 長門 | 陸奥          | Male
 陸奥 | 長門          | Male
 陸奥 | 武蔵          | Male
 伊勢 | 長門          | Male
 伊勢 | 大和          | Male
 日向 | 伊勢          | (null)
 日向 | 武蔵          | Male
 日向 | 伊勢          | (null)
 赤城 | 蒼龍          | Famale
 赤城 | 飛龍          | Famale
 赤城 | 信濃          | Famale
 赤城 | 加賀          | Famale
 加賀 | 蒼龍          | Famale
 加賀 | 伊勢          | (null)
 加賀 | 赤城          | Famale
 信濃 | 蒼龍          | Famale
 信濃 | 伊勢          | (null)
 信濃 | 武蔵          | Male
 信濃 | 加賀          | Famale
 信濃 | 大和          | Male
 飛龍 | 蒼龍          | Famale
(27 rows)

SELECT name, count(follower_name) as followes_count FROM bar2 GROUP BY name;
 name | followes_count 
------+----------------
 大和 |              3
 陸奥 |              2
 信濃 |              5
 飛龍 |              1
 武蔵 |              2
 加賀 |              3
 赤城 |              4
 日向 |              3
 長門 |              2
 伊勢 |              2
(10 rows)

双方向のフォロー(両想い)なユーザの組み合わせ
 
DROP FOREIGN TABLE IF EXISTS bar3;
psql:test4.sql:1: NOTICE:  foreign table "bar3" does not exist, skipping
DROP FOREIGN TABLE
CREATE FOREIGN TABLE bar3 (
    my_name text,
    my_gender text,
    follower_name text,
    follower_gender text)
    SERVER foo
    OPTIONS (query '{"query":"START n=node(*) MATCH p=fm<-[:follow]-n<-[:follow]-fm  RETURN n.name as my_name, n.gender as my_gender, fm.name  as follower_name, fm.gender as follower_gender" }');
CREATE FOREIGN TABLE
Null display is "(null)".
SELECT my_name, my_gender, follower_name, follower_gender FROM bar3;
 my_name | my_gender | follower_name | follower_gender 
---------+-----------+---------------+-----------------
 大和    | Male      | 武蔵          | Male
 大和    | Male      | 信濃          | Famale
 大和    | Male      | 長門          | Male
 武蔵    | Male      | 信濃          | Famale
 武蔵    | Male      | 大和          | Male
 長門    | Male      | 陸奥          | Male
 長門    | Male      | 大和          | Male
 陸奥    | Male      | 長門          | Male
 赤城    | Famale    | 加賀          | Famale
 加賀    | Famale    | 赤城          | Famale
 信濃    | Famale    | 武蔵          | Male
 信濃    | Famale    | 大和          | Male
(12 rows)

SELECT my_name, follower_name, 
CASE
    WHEN my_gender = 'Male' AND follower_gender = 'Male' THEN 'アッー!'
    WHEN my_gender = 'Famale' AND follower_gender = 'Famale' THEN 'キマシタワー!'
    ELSE 'リア充爆発しろ!'
END AS relationship
FROM bar3;
 my_name | follower_name |   relationship   
---------+---------------+------------------
 大和    | 武蔵          | アッー!
 大和    | 信濃          | リア充爆発しろ!
 大和    | 長門          | アッー!
 武蔵    | 信濃          | リア充爆発しろ!
 武蔵    | 大和          | アッー!
 長門    | 陸奥          | アッー!
 長門    | 大和          | アッー!
 陸奥    | 長門          | アッー!
 赤城    | 加賀          | キマシタワー!
 加賀    | 赤城          | キマシタワー!
 信濃    | 武蔵          | リア充爆発しろ!
 信濃    | 大和          | リア充爆発しろ!
(12 rows)

neo4j_fdw demo end
[nuko@localhost test]$

うむ。こっちも問題なく動作した。
EXTENSION周りで9.3向けに改造が必要な部分は今自分が使っている範囲ではなさそうかな。

9.3の新機能(JSONとか)や、pg_bigmなどの全文検索系の動作確認は週末に回そう。