[pgsql-jp: 40052] Re: EXECUTE USINGについて

Hitoshi Harada umi.tanuki @ gmail.com
2009年 11月 5日 (木) 01:25:38 JST


原田です。

EXECUTE ... USING文は、Perlの変数展開のような文字列生成を手伝うものではなく、あくまでSQL実行パラメータとして値を投入するもののようです。
なので、下記のようなEXECUTEはNGです。

tablename := 'mytable';
EXECUTE 'CREATE TABLE $1(i int)' USING tablename;

ERROR:  syntax error at or near "$1"
LINE 1: CREATE TABLE $1(i int)

これがうっかり通ったように見えるケース:

tablename := 'mytable';
EXECUTE 'CREATE TABLE "$1"(i int)' USING tablename;

-> $1という名前のテーブルが作成される。mytableというテーブルは作成されない。


というわけで、EXECUTE ... USINGで与えられるパラメータは、プリペアドステートメントで与えられるパラメータ(WHERE id
= $1等)と同一と考えてよいようです。



2009年11月4日21:06 Yusuke Yamasaki <tm9233yy @ gmail.com>:
> 山崎(ゆ)です。
>
>> USING t_beg::text, t_cur::text, t_end::text;
>> としてみてはどうでしょう。
>
> これでやってみました。
>
>      EXECUTE 'CREATE TABLE ' ||part|| ' (LIKE ' ||parent
>      || ' INCLUDING INDEXES INCLUDING DEFAULTS INCLUDING CONSTRAINTS, '
>      || 'CHECK ($1 <= created_at AND created_at < $2)'
>      || ') INHERITS (' ||parent|| ')'
>      USING t_beg::text, t_end::text;
>
> 結果:
>
> ERROR:  there is no parameter $1
> CONTEXT:  SQL statement "CREATE TABLE events_0911 (LIKE events
> INCLUDING INDEXES INCLUDING DEFAULTS INCLUDING CONSTRAINTS, CHECK ($1
> <= created_at AND created_at < $2)) INHERITS (events)"
> PL/pgSQL function "event_insert_trigger" line 19 at EXECUTE statement
>
>
> 同じくエラーでした。
> RECORD型しか駄目なんでしょうかねえ。。。
>
> http://postgresql.manual.php.to/plpgsql-statements.html
> 38.5.4. 動的コマンドの実行
> 「実行時負荷を回避するとともに、括弧で括るとか、エスケープをする必要がないため、SQLインジェクション攻撃に対してより襲われにくくなります。」
>
> この文面を見る限りでは、テキストなどでもできるように見えますよね。
>
> --
> Yusuke Yamasaki <tm9233yy @ gmail.com>
>



-- 
Hitoshi Harada



pgsql-jp メーリングリストの案内