@@ -1460,6 +1460,29 @@ func (s *StdDevPopAgg) StartPartition(ctx *sql.Context, interval sql.WindowInter
14601460 return err
14611461}
14621462
1463+ func computeVariance (ctx * sql.Context , interval sql.WindowInterval , buf sql.WindowBuffer , expr sql.Expression , m float64 ) (float64 , error ) {
1464+ var v float64
1465+ for i := interval .Start ; i < interval .End ; i ++ {
1466+ row := buf [i ]
1467+ val , err := expr .Eval (ctx , row )
1468+ if err != nil {
1469+ return 0 , err
1470+ }
1471+ // TODO: consider saving conversions to avoid double Converts
1472+ val , _ , err = types .Float64 .Convert (ctx , val )
1473+ if err != nil {
1474+ val = 0.0
1475+ ctx .Warn (1292 , "Truncated incorrect DOUBLE value: %s" , v )
1476+ }
1477+ if val == nil {
1478+ continue
1479+ }
1480+ dv := val .(float64 ) - m
1481+ v += dv * dv
1482+ }
1483+ return v , nil
1484+ }
1485+
14631486func (s * StdDevPopAgg ) Compute (ctx * sql.Context , interval sql.WindowInterval , buf sql.WindowBuffer ) interface {} {
14641487 startIdx := interval .Start - s .partitionStart - 1
14651488 endIdx := interval .End - s .partitionStart - 1
@@ -1478,22 +1501,9 @@ func (s *StdDevPopAgg) Compute(ctx *sql.Context, interval sql.WindowInterval, bu
14781501 }
14791502
14801503 m := computePrefixSum (interval , s .partitionStart , s .prefixSum ) / float64 (nonNullCnt )
1481- v := 0.0
1482- for i := interval .Start ; i < interval .End ; i ++ {
1483- row := buf [i ]
1484- val , err := s .expr .Eval (ctx , row )
1485- if err != nil {
1486- return err
1487- }
1488- val , _ , err = types .Float64 .Convert (ctx , val )
1489- if err != nil {
1490- return nil
1491- }
1492- if val == nil {
1493- continue
1494- }
1495- dv := val .(float64 ) - m
1496- v += dv * dv
1504+ v , err := computeVariance (ctx , interval , buf , s .expr , m )
1505+ if err != nil {
1506+ return err
14971507 }
14981508
14991509 return math .Sqrt (v / float64 (nonNullCnt ))
0 commit comments