[Oracle] SQLのトークン区切り

2018年3月5日月曜日

Oracle SQL

2FFROM

OracleでSQLのトークンの間にスペースが入っていないのに正常に実行されてしまうケースがあった。
要約するとこんな感じ。

> SELECT 2 FROM DUAL;
2

> SELECT '2' FROM DUAL;
2

> SELECT 2FROM DUAL;
ORA-00923: FROMキーワードが指定の位置にありません。

> SELECT 2FFROM DUAL;
2.0

なんだこりゃ...と思ったんだけど、これはリテラルの解析とトークン区切りの問題だった。

数値リテラル


Oracle Database SQL言語リファレンス 数値リテラル

結局、数値リテラルで解析できるところまで進んで、そこでトークンの区切りとみなしてるみたい。
"2F"というのは浮動小数点のリテラルとして正しいので、2番目の例は"2F ROM"と解釈されて、3番目の例は"2F FROM"と解釈されている。

ちょっと奇妙な感じもするけど、確かにこれがダメだとすると

> SELECT 2+1 FROM DUAL;
3

も"+"の前後にスペースを入れないといけないことになってしまうね。