xpath関数の問題はWindows版固有じゃなかった件

背景

先日のWindowsPostgreSQLで正しいはずのXPathが正しく評価されない問題をLinuxPostgreSQL 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を最新化すればいいのか?