[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 メーリングリストの案内