これは、PostgreSQL Advent Calendar 2015のDay2の記事です。
今回は、PostgreSQL経由で、Hello WorldのCプログラムを書いてコンパイルして実行してみたいと思います。
PostgreSQLの接続ポートだけ開いているようなサーバ上でHello Worldしたいときに使えるテクニックです!!
以降のSQLは、すべてスーパーユーザで実行してください。
-- Hello Worldのソースを保存するテーブルを作成します。
CREATE TABLE hello_source (line serial, code text);
-- Hello WorldのCプログラムの実行結果を保存するテーブルを作成します。
CREATE TABLE hello_result (output text);
-- COPY FROM stdinで、Hello Worldのソースをhello_sourceテーブルに保存します。
COPY hello_source (code) FROM stdin;
#include <stdio.h>
int main(void)
{
printf("Hello World !!\n");
return 0;
}
\.
-- COPY TO PROGRAMで、Hello Worldのソースを/tmp/hello.cに保存し、gccでコンパイルします。
COPY (SELECT code FROM hello_source ORDER BY line) TO
PROGRAM 'tee /tmp/hello.c; gcc -o /tmp/hello /tmp/hello.c';
-- Cプログラムを実行し、その結果をhello_resultテーブルに蓄積します。
COPY hello_result FROM PROGRAM '/tmp/hello';
-- 実行結果を確認してみましょう!!
SELECT * FROM hello_result;
注意
この例から分かるように、スーパーユーザは、PostgreSQL上のすべての操作だけでなく、任意のOSコマンドまで実行できてしまう非常に危険なユーザです。例えば、リモートからのスーパーユーザのログインを拒否するようにpg_hba.confを設定するなど、安易にはスーパーユーザが使われないようにしましょう!