>首页> IT >

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

时间:2022-03-03 14:32:40       来源:

我们执行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

微软雅黑;font-size:14px;">原文标题 : PG avg聚合操作如何将值返回给客户端

关键词: PG源码解析