2

現在、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 番目の式を直接0orに変換し、1それをオペランドとして使用します。

更新日:

バグを報告しました - http://bugs.mysql.com/bug.php?id=69208

それは間違いなく予想される構文ではありません

UPD 2 :パーサーの動作をまったく変更しない小さなタイプミスのように見えます(明確にするために、一般的なBETWEEN式では目立たなくなります)。

4

1 に答える 1