PG avg聚合操作如何将值返回给客户端

yzsDBA 2022-03-03

newsavgjpg

319 字丨阅读本文需 4 分钟

我们执行avg聚合操作时,会得到一个浮点数值。例如:

简单avg聚合操作分为2步:首先计算出和值及元组个数;然后将和值与元组个数相除。

1)第一步计算函数是int4_avg_accum:可以看到使用ArrayType转换Int8TransTypeData结构后,使用sum作为和值,count作为元组个数。

2)第2步的求平均值函数是int8_avg。首先将transdata中的count和sum都转换成numeric格式,然后再调用int8_numeric函数求平均值。结果值以Datum格式返回,也就是地址

那么问题来了,这个地址值如何返回给用户?

向客户端发送的TupleTableSlot里存储的值并不是真实值?Datum值是47785920?这个值是什么?从客户端接收的值看下如何转换?

可以看到客户端接收的值就是结果值,并没有进行转换。也就是说服务端发送的就是平均值。那就需要看服务端如何将Datum值进行转换的。

从堆栈看出printtup函数中进行转换:

转换函数由numeric_out进行转换,转换成字符串。可以看到结果值转换为了2.500000000000000

免责声明:凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处本网。非本网作品均来自其他媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如您发现有任何侵权内容,请依照下方联系方式进行沟通,我们将第一时间进行处理。

0赞 好资讯,需要你的鼓励
来自:yzsDBA
0

参与评论

登录后参与讨论 0/1000

为你推荐

加载中...