現在、mysql の SQL パーサーを調査しています。
そして、ここに私が気づいた、説明できない興味深いことがあります。
(中sql_yacc.yy
)
predicate:
...
| bit_expr BETWEEN_SYM bit_expr AND_SYM predicate
{
$$= new (YYTHD->mem_root) Item_func_between($1,$3,$5);
if ($$ == NULL)
MYSQL_YYABORT;
}
同じことが式の構文ページにあります。
predicate:
...
| bit_expr [NOT] BETWEEN bit_expr AND predicate
つまり、
foo BETWEEN 1 AND bar BETWEEN 1 AND 2
クエリは構文的に正しいですが、まったく意味がありません。
私の質問: これは何に使用できますか? 使用すると見逃されるもの
bit_expr [NOT] BETWEEN bit_expr AND bit_expr
代わりは?
LOL (実際にはもう LOL ではありません)
このクエリはエラーなしで実行されます。
select * from users where id between 1 and id between 1 and 10;
// returns row with id = 1
select * from users where id between 2 and id between 2 and 10;
Empty set (0.00 sec)
(更新はここに追加されます) ...そして実際には期待されています。
おそらく、2 番目の式を直接0
orに変換し、1
それをオペランドとして使用します。
更新日:
バグを報告しました - http://bugs.mysql.com/bug.php?id=69208
それは間違いなく予想される構文ではありません
UPD 2 :パーサーの動作をまったく変更しない小さなタイプミスのように見えます(明確にするために、一般的なBETWEEN
式では目立たなくなります)。