gpt4 book ai didi

mysql - BNF规则的解释

转载 作者:行者123 更新时间:2023-11-29 02:28:42 27 4
gpt4 key购买 nike

我正在研究 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;
}

同样是在Expression Syntax上页:

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)

此查询执行WITHOUT错误:

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)

(此处添加了更新)......实际上它预期的。

大概它将第二个表达式直接转换为 01 并将其用作操作数。

更新:

我已提交错误 - http://bugs.mysql.com/bug.php?id=69208

这绝对不是预期的语法

UPD 2:看起来这只是一个小错别字,根本不会改变解析器的行为(好吧,很明显,对于常见的 BETWEEN 表达式)。

最佳答案

你的分析基本正确:

foo BETWEEN 1 AND bar BETWEEN 1 AND 2

解析为:

foo BETWEEN 1 AND (bar BETWEEN 1 AND 2)

和第二个(带括号的)谓词可能会评估为 0 或 1(假或真)。因此,如果 bar不在 1 和 2 之间,从 foo 中选择的值集将为空(因为 foo BETWEEN 1 AND 0foo >= 1 AND f <= 0 的简写,并且没有任何值是真的,即使允许 NULL)。反之,如果bar介于 1 和 2 之间,则来自 foo 的一组选定值将是`foo1 等于 1 的集合。

对于“如果将‘predicate’术语替换为‘bit_expr’,你会损失什么?”的替代问题可能是“如果将‘bit_expr’替换为‘predicate’,你会得到什么吗?”

如果没有仔细检查完整的语法(或者至少检查 bit_exprpredicate 引用的部分,并且可能检查使用 bit_exprpredicate 的地方),它很难知道这两个问题的答案。

关于mysql - BNF规则的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16515083/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com