xpath関数の問題はWindows版固有じゃなかった件
背景
先日のWindows版PostgreSQLで正しいはずのXPathが正しく評価されない問題をLinux版PostgreSQL 9.1.3でも確認した。
検証結果
結論からいうとWindows版の問題じゃなくて、PostgreSQL xpath関数または背後のlibxml2の問題っぽい。
つーか、なんで今までこんな問題が残っているのやら。
xuidb=# select xpath('//う/text()', '<あ><い><う>ううう</う></い></あ>'::xml ); xpath ---------- {ううう} (1 row) xuidb=# select xpath('//い/う/text()', '<あ><い><う>ううう</う></い></あ>'::xml ); xpath ---------- {ううう} (1 row) xuidb=# select xpath('/あ/い/う/text()', '<あ><い><う>ううう</う></い></あ>'::xml ); ERROR: invalid XPath expression DETAIL: Invalid expression CONTEXT: SQL function "xpath" statement 1 xuidb=# select xpath('/あ/い/う', '<あ><い><う>ううう</う></い></あ>'::xml ); xpath ------------------- {<う>ううう</う>} (1 row) xuidb=# select xpath('//あ/い/う/text()', '<あ><い><う>ううう</う><え><お>おおお</お></え></い></あ>'::xml ); xpath ---------- {ううう} (1 row)
どうやら、
- パスの最初の階層が日本語
- 最初の"/"の直後が日本語
- 末端が text()
- パス区切り(/)を含む
パターンのxpath文字列だとダメっぽい。
なので、名前区間付きの文書(確か名前空間のprefixって英数字のみだった気がする)だと、xpathの最初の / の後には英字が入るので顕在化しなかったのかも。これの原因は libxml2 側なのかなあ。結構広く使われているライブラリのはずなのに・・・libxml2を最新化すればいいのか?