Help us understand the problem. What is going on with this article?

PostgreSQLでHello World!!

More than 3 years have passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away