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向けに改造が必要な部分は今自分が使っている範囲ではなさそうかな。