Skip to content

Commit 5632d67

Browse files
authored
implement stddev_pop(), stddev_samp(), var_pop(), var_samp(), and aliases (#2928)
1 parent cfa1678 commit 5632d67

File tree

11 files changed

+1342
-9
lines changed

11 files changed

+1342
-9
lines changed

enginetest/queries/script_queries.go

Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7887,6 +7887,226 @@ where
78877887
},
78887888
},
78897889
},
7890+
{
7891+
Name: "std, stdev, stddev_pop, variance, var_pop, var_samp tests",
7892+
Dialect: "mysql",
7893+
SetUpScript: []string{
7894+
"create table t (i int);",
7895+
"create table tt (i int, j int);",
7896+
"insert into tt values (0, 1), (0, 2), (0, 3);",
7897+
"insert into tt values (1, 123), (1, 456), (1, 789);",
7898+
},
7899+
Assertions: []ScriptTestAssertion{
7900+
{
7901+
Query: "select std(i), stddev(i), stddev_pop(i), stddev_samp(i) from t;",
7902+
Expected: []sql.Row{
7903+
{nil, nil, nil, nil},
7904+
},
7905+
},
7906+
{
7907+
Query: "select variance(i), var_pop(i), var_samp(i) from t;",
7908+
Expected: []sql.Row{
7909+
{nil, nil, nil},
7910+
},
7911+
},
7912+
{
7913+
Query: "insert into t values (1);",
7914+
Expected: []sql.Row{
7915+
{types.NewOkResult(1)},
7916+
},
7917+
},
7918+
{
7919+
Query: "select std(i), stddev(i), stddev_pop(i), stddev_samp(i) from t;",
7920+
Expected: []sql.Row{
7921+
{0.0, 0.0, 0.0, nil},
7922+
},
7923+
},
7924+
{
7925+
Query: "select variance(i), var_pop(i), var_samp(i) from t;",
7926+
Expected: []sql.Row{
7927+
{0.0, 0.0, nil},
7928+
},
7929+
},
7930+
{
7931+
Query: "insert into t values (2);",
7932+
Expected: []sql.Row{
7933+
{types.NewOkResult(1)},
7934+
},
7935+
},
7936+
{
7937+
Query: "select std(i), stddev(i), stddev_pop(i), stddev_samp(i) from t;",
7938+
Expected: []sql.Row{
7939+
{0.5, 0.5, 0.5, 0.7071067811865476},
7940+
},
7941+
},
7942+
{
7943+
Query: "select variance(i), var_pop(i), var_samp(i) from t;",
7944+
Expected: []sql.Row{
7945+
{0.25, 0.25, 0.5},
7946+
},
7947+
},
7948+
{
7949+
Query: "insert into t values (3);",
7950+
Expected: []sql.Row{
7951+
{types.NewOkResult(1)},
7952+
},
7953+
},
7954+
{
7955+
Query: "select std(i), stddev(i), stddev_pop(i), stddev_samp(i) from t;",
7956+
Expected: []sql.Row{
7957+
{0.816496580927726, 0.816496580927726, 0.816496580927726, 1.0},
7958+
},
7959+
},
7960+
{
7961+
Query: "select variance(i), var_pop(i), var_samp(i) from t;",
7962+
Expected: []sql.Row{
7963+
{0.6666666666666666, 0.6666666666666666, 1.0},
7964+
},
7965+
},
7966+
{
7967+
Query: "insert into t values (null), (null);",
7968+
Expected: []sql.Row{
7969+
{types.NewOkResult(2)},
7970+
},
7971+
},
7972+
{
7973+
Query: "select std(i), stddev(i), stddev_pop(i), stddev_samp(i) from t;",
7974+
Expected: []sql.Row{
7975+
{0.816496580927726, 0.816496580927726, 0.816496580927726, 1.0},
7976+
},
7977+
},
7978+
{
7979+
Query: "select variance(i), var_pop(i), var_samp(i) from t;",
7980+
Expected: []sql.Row{
7981+
{0.6666666666666666, 0.6666666666666666, 1.0},
7982+
},
7983+
},
7984+
{
7985+
Query: "select i, std(j), stddev_samp(j) from tt group by i;",
7986+
Expected: []sql.Row{
7987+
{0, 0.816496580927726, 1.0},
7988+
{1, 271.89336144893275, 333.0},
7989+
},
7990+
},
7991+
{
7992+
Query: "select i, variance(i), var_samp(i) from tt group by i;",
7993+
Expected: []sql.Row{
7994+
{0, 0.0, 0.0},
7995+
{1, 0.0, 0.0},
7996+
},
7997+
},
7998+
{
7999+
Query: "select std(i) over(), std(j) over(), stddev_samp(j) over() from tt order by i;",
8000+
Expected: []sql.Row{
8001+
{0.5, 297.47660972475353, 325.86929895281634},
8002+
{0.5, 297.47660972475353, 325.86929895281634},
8003+
{0.5, 297.47660972475353, 325.86929895281634},
8004+
{0.5, 297.47660972475353, 325.86929895281634},
8005+
{0.5, 297.47660972475353, 325.86929895281634},
8006+
{0.5, 297.47660972475353, 325.86929895281634},
8007+
},
8008+
},
8009+
{
8010+
Query: "select i, std(j) over(partition by i), stddev_samp(j) over(partition by i) from tt order by i;",
8011+
Expected: []sql.Row{
8012+
{0, 0.816496580927726, 1.0},
8013+
{0, 0.816496580927726, 1.0},
8014+
{0, 0.816496580927726, 1.0},
8015+
{1, 271.89336144893275, 333.0},
8016+
{1, 271.89336144893275, 333.0},
8017+
{1, 271.89336144893275, 333.0},
8018+
},
8019+
},
8020+
{
8021+
Query: "select i, variance(i) over(), var_samp(i) over() from tt order by i;",
8022+
Expected: []sql.Row{
8023+
{0, 0.25, 0.3},
8024+
{0, 0.25, 0.3},
8025+
{0, 0.25, 0.3},
8026+
{1, 0.25, 0.3},
8027+
{1, 0.25, 0.3},
8028+
{1, 0.25, 0.3},
8029+
},
8030+
},
8031+
{
8032+
Query: "select i, variance(j) over(partition by i), var_samp(i) over(partition by i) from tt order by i;",
8033+
Expected: []sql.Row{
8034+
{0, 0.6666666666666666, 0.0},
8035+
{0, 0.6666666666666666, 0.0},
8036+
{0, 0.6666666666666666, 0.0},
8037+
{1, 73926.0, 0.0},
8038+
{1, 73926.0, 0.0},
8039+
{1, 73926.0, 0.0},
8040+
},
8041+
},
8042+
{
8043+
Query: "insert into tt values (null, null);",
8044+
Expected: []sql.Row{
8045+
{types.NewOkResult(1)},
8046+
},
8047+
},
8048+
{
8049+
Query: "select i, std(i) over(), std(j) over(), stddev_samp(j) over() from tt order by i;",
8050+
Expected: []sql.Row{
8051+
{nil, 0.5, 297.47660972475353, 325.86929895281634},
8052+
{0, 0.5, 297.47660972475353, 325.86929895281634},
8053+
{0, 0.5, 297.47660972475353, 325.86929895281634},
8054+
{0, 0.5, 297.47660972475353, 325.86929895281634},
8055+
{1, 0.5, 297.47660972475353, 325.86929895281634},
8056+
{1, 0.5, 297.47660972475353, 325.86929895281634},
8057+
{1, 0.5, 297.47660972475353, 325.86929895281634},
8058+
},
8059+
},
8060+
{
8061+
Query: "select i, std(j) over(partition by i), stddev_samp(j) over(partition by i) from tt order by i;",
8062+
Expected: []sql.Row{
8063+
{nil, nil, nil},
8064+
{0, 0.816496580927726, 1.0},
8065+
{0, 0.816496580927726, 1.0},
8066+
{0, 0.816496580927726, 1.0},
8067+
{1, 271.89336144893275, 333.0},
8068+
{1, 271.89336144893275, 333.0},
8069+
{1, 271.89336144893275, 333.0},
8070+
},
8071+
},
8072+
{
8073+
Query: "select i, variance(i) over(), var_samp(i) over() from tt order by i;",
8074+
Expected: []sql.Row{
8075+
{nil, 0.25, 0.3},
8076+
{0, 0.25, 0.3},
8077+
{0, 0.25, 0.3},
8078+
{0, 0.25, 0.3},
8079+
{1, 0.25, 0.3},
8080+
{1, 0.25, 0.3},
8081+
{1, 0.25, 0.3},
8082+
},
8083+
},
8084+
{
8085+
Query: "select i, variance(j) over(partition by i), var_samp(i) over(partition by i) from tt order by i;",
8086+
Expected: []sql.Row{
8087+
{nil, nil, nil},
8088+
{0, 0.6666666666666666, 0.0},
8089+
{0, 0.6666666666666666, 0.0},
8090+
{0, 0.6666666666666666, 0.0},
8091+
{1, 73926.0, 0.0},
8092+
{1, 73926.0, 0.0},
8093+
{1, 73926.0, 0.0},
8094+
},
8095+
},
8096+
{
8097+
Query: "select i, stddev_pop(j) over w, stddev_samp(j) over w, variance(j) over w, var_samp(i) over w from tt window w as (partition by i) order by i;",
8098+
Expected: []sql.Row{
8099+
{nil, nil, nil, nil, nil},
8100+
{0, 0.816496580927726, 1.0, 0.6666666666666666, 0.0},
8101+
{0, 0.816496580927726, 1.0, 0.6666666666666666, 0.0},
8102+
{0, 0.816496580927726, 1.0, 0.6666666666666666, 0.0},
8103+
{1, 271.89336144893275, 333.0, 73926.0, 0.0},
8104+
{1, 271.89336144893275, 333.0, 73926.0, 0.0},
8105+
{1, 271.89336144893275, 333.0, 73926.0, 0.0},
8106+
},
8107+
},
8108+
},
8109+
},
78908110
}
78918111

78928112
var SpatialScriptTests = []ScriptTest{

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ require (
66
github.com/dolthub/go-icu-regex v0.0.0-20250327004329-6799764f2dad
77
github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71
88
github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81
9-
github.com/dolthub/vitess v0.0.0-20250409183615-d8335325e91c
9+
github.com/dolthub/vitess v0.0.0-20250410090211-143e6b272ad4
1010
github.com/go-kit/kit v0.10.0
1111
github.com/go-sql-driver/mysql v1.7.2-0.20231213112541-0004702b931d
1212
github.com/gocraft/dbr/v2 v2.7.2

go.sum

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,8 @@ github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 h1:bMGS25NWAGTE
5858
github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71/go.mod h1:2/2zjLQ/JOOSbbSboojeg+cAwcRV0fDLzIiWch/lhqI=
5959
github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81 h1:7/v8q9XGFa6q5Ap4Z/OhNkAMBaK5YeuEzwJt+NZdhiE=
6060
github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81/go.mod h1:siLfyv2c92W1eN/R4QqG/+RjjX5W2+gCTRjZxBjI3TY=
61-
github.com/dolthub/vitess v0.0.0-20250325024605-8131be3ca6d3 h1:euU+adNAYw46Zcp1HnoaSDWhqjfaL8s/1SPU+i16gYM=
62-
github.com/dolthub/vitess v0.0.0-20250325024605-8131be3ca6d3/go.mod h1:1gQZs/byeHLMSul3Lvl3MzioMtOW1je79QYGyi2fd70=
63-
github.com/dolthub/vitess v0.0.0-20250409183615-d8335325e91c h1:hl+yPanHdJML9aMB0MgrTCpzsd3jIf/o3r8pC6Tqx6E=
64-
github.com/dolthub/vitess v0.0.0-20250409183615-d8335325e91c/go.mod h1:1gQZs/byeHLMSul3Lvl3MzioMtOW1je79QYGyi2fd70=
61+
github.com/dolthub/vitess v0.0.0-20250410090211-143e6b272ad4 h1:LGTt2LtYX8vaai32d+c9L0sMcP+Dg9w1kO6+lbsxxYg=
62+
github.com/dolthub/vitess v0.0.0-20250410090211-143e6b272ad4/go.mod h1:1gQZs/byeHLMSul3Lvl3MzioMtOW1je79QYGyi2fd70=
6563
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
6664
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
6765
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=

optgen/cmd/source/unary_aggs.yaml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,12 @@ unaryAggs:
3131
desc: "returns the minimum value of expr in all rows."
3232
- name: "Sum"
3333
desc: "returns the sum of expr in all rows"
34-
nullable: false
34+
nullable: false
35+
- name: "StdDevPop"
36+
desc: "returns the population standard deviation of expr"
37+
- name: "StdDevSamp"
38+
desc: "returns the sample standard deviation of expr"
39+
- name: "VarPop"
40+
desc: "returns the population variance of expr"
41+
- name: "VarSamp"
42+
desc: "returns the sample variance of expr"

sql/expression/function/aggregation/common.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,11 @@ func (a *unaryAggBase) WithChildren(children ...sql.Expression) (sql.Expression,
125125
return &na, nil
126126
}
127127

128-
func (a unaryAggBase) FunctionName() string {
128+
func (a *unaryAggBase) FunctionName() string {
129129
return a.functionName
130130
}
131131

132-
func (a unaryAggBase) Description() string {
132+
func (a *unaryAggBase) Description() string {
133133
return a.description
134134
}
135135

0 commit comments

Comments
 (0)