我现在正在研究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)
(这里添加了更新)......实际上它是预期的。
大概它将第二个表达式直接转换为0
或1
并将其用作操作数。
更新:
我提交了一个错误 - http://bugs.mysql.com/bug.php?id=69208
这绝对不是预期的语法
UPD 2:所以看起来它只是一个小错字,根本不会改变解析器的行为(好吧,要清楚,它会使普通BETWEEN
表达式的速度变慢而难以察觉)。