在計算distinct聚合時候,還需要必須實現aggregator::endup(),因為Distinct_aggregator::add() 只是通過某種方式採集了unique的行,但是並未保存,需要在這個階段進行保存。這個過程也可以理解,因為在Distinct聚合過程中(add),實際上無法判斷是否為唯一。當然這個不適用於GROUP BY場景,因為GROUP BY場景本身就是通過臨時表解決了唯一的問題。
Item_sum繼承Item_result_field,意味著該類作為計算函數的同時,也保存輸出的結果。具體可以看對應Item_sum_xxx::val_xxx的實現,該函數負責對上層結果或者客戶端結果進行輸出。
但是,對於特殊聚合函數如AVG/STD/VAR_POP等函數,在累加過程中,臨時保存的變數值有多個,實際的輸出結果必須通過加工處理,尤其是在GROUP BY的場景下,多個臨時變數需要保存到Temp table中,下次累加的時候取出來,直到最終結果輸出。因此,需要額外的輔助Item_result_field類,幫助該聚合函數進行最終結果輸出。下圖為各個輔助Item_result_field的繼承關係。