欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 42 mysql “+“ 操作符的实现

42 mysql “+“ 操作符的实现

2025/5/7 6:27:07 来源:https://blog.csdn.net/u011039332/article/details/131864874  浏览:    关键词:42 mysql “+“ 操作符的实现

前言

问题来自于 chinaunix, mysql select 子句的小白问题 

mysql 的一些基础的 算术运算符 的计算的实现

这里 整理如下 case, 执行之前 设置如下变量

set @a = 2;
set @b = 3;select @a + @b;
select 'a' + 'b';
select 1 + 3;
select '1' + '3';
select 'a + b';
select a + b;

 

 

select @a + @b;

解析 sql 的时候, 会将 表达式 解析为一个 Item_func_plus, 左右操作数为 Item_func_get_user_var 变量名分别为 a, b

2f4558e20f6c4237b21983234fff6e5b.png

 

查询的时候 选择列即为 上面解析表达式的时候 resolve 的 Item_func_plus

然后由 Item_func_plus 来计算结果, 以及响应数据 

d5393378c27447878f0c925a4a76a738.png

 

取变量的方式为, 从 user_var_entry 中获取存储的数据值, 这个值是上面 “set @a = 2;” 设置进去的 

bf4e473a662b4116b597880352fbf561.png

 

具体的 计算业务是由这里的 val0 + val1, 以及 之后的符号相关处理 来完成的

得到结果 2 + 3 = 5

2212f124cf4a4aeb89e2be8591985897.png

 

 

select 'a' + 'b';

解析表达式的的时候, 合成一个 Item_func_plus, 左右操作数为 字面量 ”a”, ”b”

7faba5e80214409195e1201fa866f066.png

 

计算的时候, 尝试将 “a” 转换为 int 的时候 “a” 不符合 数字的相关规范, my_strntod 计算为 0

de580d2742744f7290e82bc59f5c10cb.png 

因此 计算结果为 0 + 0 = 0

01090431702646d7a963b9ad08ec784a.png 

 

select 1 + 3; 

解析表达式的的时候, 合成一个 Item_func_plus, 左右操作数为 数字 1, 3

ad97886c8e0f4f61ab11eca25f6c03c6.png

 

计算的时候, 获取数字 1 的值, 为 1

cf12efeb4c1240838cff7270f7ab0b3b.png 

计算结果为 1 + 3 = 4

eef3034d15c742e98ae03b7e41325ca2.png 

 

select '1' + '3';

解析表达式的的时候, 合成一个 Item_func_plus, 左右操作数为 字面量 ”1”, ”3”  

57a5e04b4d9d48068a0ad9faea10f499.png

 

将字面量转换为数字的时候, “1” 转换为 1, “3” 转换为 3

50eb178249e34d15904d6ddad0347aa4.png 

计算结果为 1 + 3 = 4

2f5f07f31f80491eb4afb6dabb95a64c.png 

 

select 'a + b';

解析表达式的时候, 解析为一个 常量字面量 “a + b”

262111575af04d1c8d41248fb1268472.png

 

然后 响应的时候, 直接 响应给定的字面量的字符串

410b1ed6c0324091b13c62b87b06a3e3.png 

 

select a + b;

解析表达式的的时候, 合成一个 Item_func_plus, 左右操作数为 Identifier 标记分别为 “a”, “b”

5d4b1afefe7d4a53b476a6c119acbad9.png

 

如果这里是 表中的两个字段, 这里也是类似的效果 

select field1 + field2 from tz_test;

cc3d844c3a0746ed8f7ba7fd9e7aee0a.png

 

然后后面 setup_fields 的时候, 从数据表中获取 a, b 对应的字段, 不存在 该字段

然后 抛出了 ER_BAD_FIELD_ERROR 其错误码为 1054

4c88b520fe6b45f79d2948da5157c7ae.png

 

 

@a, @b 这些变量取自哪里? 

执行 sql 如下 “set @a = 10;”

可以看到 是通过 “a” 从当前 session 的 user_vars 的一个 Map 中存取的变量 

1f6077209cd04d5aa5a7d663b6e10e71.png

 

 

 

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词