• 22
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

これは、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を設定するなど、安易にはスーパーユーザが使われないようにしましょう!

この投稿は PostgreSQL Advent Calendar 20152日目の記事です。