2013-08-31 57 views
0

了在How to recalculate a field on GROUP按照我的意见,我试图欺骗MySQL算术加左到右?

但是,评价涉及用户变量表达式的顺序是不确定的。

user variables诅咒通过以下方式使用加法运算符:

SELECT @a + LEAST(0, @a:= @a + 1) 

以这种方式使用LEAST/GREATEST当然不是我的主意的。

我试图找到关于加号运算符的执行顺序的文档,但很奇怪,我不能。 Arithmetic Operators手册页在主题上没有任何内容,也没有Operator Precedence。那么,加操作总是从左到右运行,还是未定义?

+0

此引用是指SELECT语句中的评估顺序,而不是表达式评估的顺序,请仔细阅读手册:http://dev.mysql.com/doc/refman/5.0/en/user- variables.html,他们写道'SELECT @a,(@a:= @ a + 1),...'中的评估顺序未定,MySql可以自由评估(@a:= @ a + 1)首先,然后@a,即使@a在SELECT语句前面(@a:= @ a + 1) – krokodilko

+0

我已经编辑了这个问题,以使它更清楚我后面的内容。 – chx

回答

-1

有一点点认为这MySQL bug包含该YACC片段(当然,可以在真正的源代码树中找到,例如here):

%left '-' '+' 

我们走吧!它没有文档,但源代码很容易胜过文档。

+1

这是解析器看到的内容,但可能会有一个优化阶段。此外,通过查看代码,您可能知道现在的情况,但您无法知道它们将在明天如何实现。 –

+1

定义了语法中的关联性,它仅仅反映了普通的算术规则。它没有在运行时定义评估顺序。你引用的线程是关于优先级,而不是关联性。 – EJP

+0

那么,答案是什么? – chx