上級国民専用SQL関数をどうやってリストアップすべきか

superuser専用SQL関数

最近、PostgreSQLのsuperuser権限でのみ実行可能な操作ってなんじゃろ?というのを調べていたんだけど、その調べ物の一環として、SQL関数についてもsuperuser権限でのみ実行可能なものが何かを調べようとしていた。
最初、システムカタログ pg_proc あたりを調べればすぐに分かるかな?とか軽く考えていたけど、よくよく思い出してみると、そもそもCREATE FUNCTIONALTER FUNCTIONにそんなオプションなかったよなあと気づいた。
なので、CREATE FUNCTION背景で更新される pg_proc のメンバにもそんなフラグはない。
pg_proc.proacl には権限情報は設定されるが、上級国民たるsuperuserはこの指定は無視するしなあ。

PostgreSQL文書から調べる

PostgreSQL文書のSQL関数の章に、この関数はスーパーユーザのみ実行可能、みたいな記述がある関数はある。
例えば、サーバシグナル送信関数などは

これらの関数の使用は、注記された例外を除き、大抵の場合スーパーユーザのみに制限されています。

とか書いてある。実際、スーパーユーザ権限をもたない、一般国民一般ユーザ権限のユーザ(foo)で実行すると、

[nuko@localhost src]$ psql postgres -U foo -c "SELECT pg_reload_conf()"
ERROR:  permission denied for function pg_reload_conf
[nuko@localhost src]$ psql postgres -U postgres -c "SELECT pg_reload_conf()"
 pg_reload_conf 
----------------
 t
(1 row)

許可がないと怒られてしまう。上級国民スーパーユーザは問題なく実行できるのに!

PostgreSQL文書に明記されている関数はいいのだが、問題はそうした明記がないような関数だ。
例えば、pg_ls_dir()という指定したパスのディレクトリの内容を一覧表示するSQL関数があるのだが、この関数の説明には実行にスーパーユーザ権限が必要、とは書かれていない(少なくとも自分にはそう書かれていると理解できなかった)。
実際、この関数はスーパーユーザ権限がないと実行できない。

[nuko@localhost src]$ psql postgres -U postgres -c "SELECT pg_ls_dir('.')"
      pg_ls_dir       
----------------------
 pg_xlog
 global
 pg_clog
(中略)
 postmaster.opts
 postmaster.pid
(24 rows)

[nuko@localhost src]$ psql postgres -U foo -c "SELECT pg_ls_dir('.')"
ERROR:  must be superuser to get directory listings
[nuko@localhost src]$ 

データベースクラスタ内のファイルやディレクトリの情報を、一般ユーザに参照させないというのは分からんでもないが、だとしてもPostgreSQL文書には明記して欲しい気もするのよ。

まあ、ちょいとPostgreSQL的な常識を働かせれば、スーパーユーザ権限でないと実行できない関数というのは、

くらいじゃないかと推測できるのかもしれないが、一応確認してみたくはなる。

で、どうやって調べるか。

結局はソースを当たるしかないのかな・・・
PostgreSQLソース内で、カレントユーザがスーパーユーザ権限なのかどうかを判定するC関数 superuser() というのがあるので、それをリストアップして、使っているSQL関数のソースを探り当てるしかないのかな・・・

[nuko@localhost src]$ find . -name "*.c" | xargs egrep -n "if \(.?superuser\(\)\)" | wc
     59     177    3188
[nuko@localhost src]$ 

9.5のソースだと59箇所あるのか・・・。面倒だのう。
自分でSQL関数を動かして確認するほうが手っ取り早いかなぁ。