Reserved Words (予約語)

oninit

2009年03月25日 01:42

Informix Dynamic Serverでは、SQLの識別子として、SQLの予約語を使うことができます。但し、識別子に予約語を使った結果として文法の解釈が行き詰まる可能性があります。

Informix のバージョンアップに伴い、予約語は増えています。この結果、古いバージョンから最新バージョンに移行する時に問題が発生するケースが考えられます。その具体的な例を考えています。

例えば、こんなことをしてみます。

CREATE TABLE t ( first INTEGER, second CHAR(10) );
INSERT INTO t VALUES ( 1, 'String 1' );
INSERT INTO t VALUES ( 2, 'String 2' );

以下のSQLは、それぞれどんな結果になるでしょう?

(1) SELECT first FROM t;
(2) SELECT FIRST 1 first FROM t ORDER BY first DESC;
(3) SELECT first ichibanme from t;

上記の(3) のケースについては、クライアント側で環境変数DELIMIDENT ( setenv DELIMIDENT y )を使うと、問題の解決につながりそうですね。この環境変数を設定することで、識別子を二重引用符で囲んで表記できるようになります。以下、引用符の使い方を見るため、さらにいくつか試してみたいと思います。

(1) SELECT "first" Ichibanme FROM t; -- 列 first の値が表示され、見出しが ichibanme (すべて小文字)
(2) SELECT 'first' "Ichibanme" FROM t; -- 値 'first' が表示され、見出しが Ichibanme
(3) SELECT 'first' 'Ichibanme' FROM t; -- -201:文法エラー
(4) SELECT "FIRST" as Ichibanme FROM t; --(1)と同じ。
(5) SELECT "first" as "Ichibanme" FROM t; -- 列 first の値が表示され、見出しが Ichibanme (先頭大文字)
(6) SELECT "first" as 'Ichibanme' FROM t; -- -201:文法エラー。


環境変数DELIMIDENTが設定されていると単引用符(Single Quote)と二重引用符(Double Quote)の役割が違うのを実感できますね。( 単引用符でクオートすると識別子とは看做されない。)。DELIMIDENTを設定していないと、文字列の引用符として、単引用符でも二重引用符でも使用できますが、設定していると、文字列は単引用符、識別子は二重引用符、という厳格なチェックが行われます。そのため、上記の例では、(6)はエラーになります。

それから、DELIMIDENTが設定されている状態では、INSERT INTO t VALUES ( 1, "String 1" );

のようなSQLは文法エラーになります。それから、見出しは、実は識別子なので、

SELECT "FIRST" as 'Ichibanme' FROM t;
SELECT "FIRST" 'Ichibanme' FROM t;

はいずれも構文エラーになります。




関連記事