Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
8eddd4d4
Commit
8eddd4d4
authored
Dec 14, 2002
by
vva@eagle.mysql.r18.ru
Browse files
Options
Browse Files
Download
Plain Diff
Merge vvagin@work.mysql.com:/home/bk/mysql-4.1
into eagle.mysql.r18.ru:/home/vva/work/VARIANCE/4.1.clone
parents
4963f1c6
b624df72
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
128 additions
and
62 deletions
+128
-62
mysql-test/r/func_group.result
mysql-test/r/func_group.result
+20
-20
mysql-test/r/having.result
mysql-test/r/having.result
+4
-0
mysql-test/r/select.result
mysql-test/r/select.result
+8
-8
mysql-test/t/func_group.test
mysql-test/t/func_group.test
+5
-5
mysql-test/t/having.test
mysql-test/t/having.test
+1
-0
mysql-test/t/select.test
mysql-test/t/select.test
+2
-2
sql/item.cc
sql/item.cc
+1
-1
sql/item.h
sql/item.h
+2
-1
sql/item_sum.cc
sql/item_sum.cc
+33
-11
sql/item_sum.h
sql/item_sum.h
+45
-12
sql/lex.h
sql/lex.h
+1
-0
sql/sql_select.cc
sql/sql_select.cc
+3
-2
sql/sql_yacc.yy
sql/sql_yacc.yy
+3
-0
No files found.
mysql-test/r/func_group.result
View file @
8eddd4d4
...
@@ -42,21 +42,21 @@ insert into t1 values (null,null,'');
...
@@ -42,21 +42,21 @@ insert into t1 values (null,null,'');
select count(distinct a),count(distinct grp) from t1;
select count(distinct a),count(distinct grp) from t1;
count(distinct a) count(distinct grp)
count(distinct a) count(distinct grp)
6 3
6 3
select sum(a),count(a),avg(a),std(a),bit_or(a),bit_and(a),min(a),max(a),min(c),max(c) from t1;
select sum(a),count(a),avg(a),std(a),
variance(a),
bit_or(a),bit_and(a),min(a),max(a),min(c),max(c) from t1;
sum(a) count(a) avg(a) std(a) bit_or(a) bit_and(a) min(a) max(a) min(c) max(c)
sum(a) count(a) avg(a) std(a)
variance(a)
bit_or(a) bit_and(a) min(a) max(a) min(c) max(c)
21 6 3.5000 1.7078 7 0 1 6 E
21 6 3.5000 1.7078
2.9167
7 0 1 6 E
select grp, sum(a),count(a),avg(a),std(a),bit_or(a),bit_and(a),min(a),max(a),min(c),max(c) from t1 group by grp;
select grp, sum(a),count(a),avg(a),std(a),
variance(a),
bit_or(a),bit_and(a),min(a),max(a),min(c),max(c) from t1 group by grp;
grp sum(a) count(a) avg(a) std(a) bit_or(a) bit_and(a) min(a) max(a) min(c) max(c)
grp sum(a) count(a) avg(a) std(a)
variance(a)
bit_or(a) bit_and(a) min(a) max(a) min(c) max(c)
NULL 0 0 NULL NULL 0 0 NULL NULL
NULL 0 0 NULL NULL
NULL
0 0 NULL NULL
1 1 1 1.0000 0.0000 1 1 1 1 a a
1 1 1 1.0000 0.0000
0.0000
1 1 1 1 a a
2 5 2 2.5000 0.5000 3 2 2 3 b c
2 5 2 2.5000 0.5000
0.2500
3 2 2 3 b c
3 15 3 5.0000 0.8165 7 4 4 6 C E
3 15 3 5.0000 0.8165
0.6667
7 4 4 6 C E
select grp, sum(a)+count(a)+avg(a)+std(a)+bit_or(a)+bit_and(a)+min(a)+max(a)+min(c)+max(c) as sum from t1 group by grp;
select grp, sum(a)+count(a)+avg(a)+std(a)+
variance(a)+
bit_or(a)+bit_and(a)+min(a)+max(a)+min(c)+max(c) as sum from t1 group by grp;
grp sum
grp sum
NULL NULL
NULL NULL
1 7
1 7
2 20
2 20
.25
3 4
4.816496580928
3 4
5.483163247594
create table t2 (grp int, a bigint unsigned, c char(10));
create table t2 (grp int, a bigint unsigned, c char(10));
insert into t2 select grp,max(a)+max(grp),max(c) from t1 group by grp;
insert into t2 select grp,max(a)+max(grp),max(c) from t1 group by grp;
replace into t2 select grp, a, c from t1 limit 2,1;
replace into t2 select grp, a, c from t1 limit 2,1;
...
@@ -72,14 +72,14 @@ CREATE TABLE t1 (id int(11),value1 float(10,2));
...
@@ -72,14 +72,14 @@ CREATE TABLE t1 (id int(11),value1 float(10,2));
INSERT INTO t1 VALUES (1,0.00),(1,1.00), (1,2.00), (2,10.00), (2,11.00), (2,12.00);
INSERT INTO t1 VALUES (1,0.00),(1,1.00), (1,2.00), (2,10.00), (2,11.00), (2,12.00);
CREATE TABLE t2 (id int(11),name char(20));
CREATE TABLE t2 (id int(11),name char(20));
INSERT INTO t2 VALUES (1,'Set One'),(2,'Set Two');
INSERT INTO t2 VALUES (1,'Set One'),(2,'Set Two');
select id, avg(value1), std(value1) from t1 group by id;
select id, avg(value1), std(value1)
, variance(value1)
from t1 group by id;
id avg(value1) std(value1)
id avg(value1) std(value1)
variance(value1)
1 1.000000 0.816497
1 1.000000 0.816497
0.666667
2 11.000000 0.816497
2 11.000000 0.816497
0.666667
select name, avg(value1), std(value1) from t1, t2 where t1.id = t2.id group by t1.id;
select name, avg(value1), std(value1)
, variance(value1)
from t1, t2 where t1.id = t2.id group by t1.id;
name avg(value1) std(value1)
name avg(value1) std(value1)
variance(value1)
Set One 1.000000 0.816497
Set One 1.000000 0.816497
0.666667
Set Two 11.000000 0.816497
Set Two 11.000000 0.816497
0.666667
drop table t1,t2;
drop table t1,t2;
create table t1 (id int not null);
create table t1 (id int not null);
create table t2 (id int not null,rating int null);
create table t2 (id int not null,rating int null);
...
...
mysql-test/r/having.result
View file @
8eddd4d4
...
@@ -62,4 +62,8 @@ select Fld1, max(Fld2) from t1 group by Fld1 having std(Fld2) is not null;
...
@@ -62,4 +62,8 @@ select Fld1, max(Fld2) from t1 group by Fld1 having std(Fld2) is not null;
Fld1 max(Fld2)
Fld1 max(Fld2)
1 20
1 20
3 50
3 50
select Fld1, max(Fld2) from t1 group by Fld1 having variance(Fld2) is not null;
Fld1 max(Fld2)
1 20
3 50
drop table t1;
drop table t1;
mysql-test/r/select.result
View file @
8eddd4d4
...
@@ -2656,14 +2656,14 @@ companynr count(*)
...
@@ -2656,14 +2656,14 @@ companynr count(*)
58 23
58 23
53 4
53 4
50 11
50 11
select count(*),min(fld4),max(fld4),sum(fld1),avg(fld1),std(fld1) from t2 where companynr = 34 and fld4<>"";
select count(*),min(fld4),max(fld4),sum(fld1),avg(fld1),std(fld1)
,variance(fld1)
from t2 where companynr = 34 and fld4<>"";
count(*) min(fld4) max(fld4) sum(fld1) avg(fld1) std(fld1)
count(*) min(fld4) max(fld4) sum(fld1) avg(fld1) std(fld1)
variance(fld1)
70 absentee vest 17788966 254128.0857 3272.5940
70 absentee vest 17788966 254128.0857 3272.5940
10709871.3069
select companynr,count(*),min(fld4),max(fld4),sum(fld1),avg(fld1),std(fld1) from t2 group by companynr limit 3;
select companynr,count(*),min(fld4),max(fld4),sum(fld1),avg(fld1),std(fld1)
,variance(fld1)
from t2 group by companynr limit 3;
companynr count(*) min(fld4) max(fld4) sum(fld1) avg(fld1) std(fld1)
companynr count(*) min(fld4) max(fld4) sum(fld1) avg(fld1) std(fld1)
variance(fld1)
00 82 Anthony windmills 10355753 126289.6707 115550.9757
00 82 Anthony windmills 10355753 126289.6707 115550.9757
13352027981.7087
29 95 abut wetness 14473298 152350.5053 8368.5480
29 95 abut wetness 14473298 152350.5053 8368.5480
70032594.9026
34 70 absentee vest 17788966 254128.0857 3272.5940
34 70 absentee vest 17788966 254128.0857 3272.5940
10709871.3069
select companynr,t2nr,count(price),sum(price),min(price),max(price),avg(price) from t3 where companynr = 37 group by companynr,t2nr limit 10;
select companynr,t2nr,count(price),sum(price),min(price),max(price),avg(price) from t3 where companynr = 37 group by companynr,t2nr limit 10;
companynr t2nr count(price) sum(price) min(price) max(price) avg(price)
companynr t2nr count(price) sum(price) min(price) max(price) avg(price)
37 1 1 5987435 5987435 5987435 5987435.0000
37 1 1 5987435 5987435 5987435 5987435.0000
...
...
mysql-test/t/func_group.test
View file @
8eddd4d4
...
@@ -21,9 +21,9 @@ select count(distinct a),count(distinct grp) from t1;
...
@@ -21,9 +21,9 @@ select count(distinct a),count(distinct grp) from t1;
insert
into
t1
values
(
null
,
null
,
''
);
insert
into
t1
values
(
null
,
null
,
''
);
select
count
(
distinct
a
),
count
(
distinct
grp
)
from
t1
;
select
count
(
distinct
a
),
count
(
distinct
grp
)
from
t1
;
select
sum
(
a
),
count
(
a
),
avg
(
a
),
std
(
a
),
bit_or
(
a
),
bit_and
(
a
),
min
(
a
),
max
(
a
),
min
(
c
),
max
(
c
)
from
t1
;
select
sum
(
a
),
count
(
a
),
avg
(
a
),
std
(
a
),
variance
(
a
),
bit_or
(
a
),
bit_and
(
a
),
min
(
a
),
max
(
a
),
min
(
c
),
max
(
c
)
from
t1
;
select
grp
,
sum
(
a
),
count
(
a
),
avg
(
a
),
std
(
a
),
bit_or
(
a
),
bit_and
(
a
),
min
(
a
),
max
(
a
),
min
(
c
),
max
(
c
)
from
t1
group
by
grp
;
select
grp
,
sum
(
a
),
count
(
a
),
avg
(
a
),
std
(
a
),
variance
(
a
),
bit_or
(
a
),
bit_and
(
a
),
min
(
a
),
max
(
a
),
min
(
c
),
max
(
c
)
from
t1
group
by
grp
;
select
grp
,
sum
(
a
)
+
count
(
a
)
+
avg
(
a
)
+
std
(
a
)
+
bit_or
(
a
)
+
bit_and
(
a
)
+
min
(
a
)
+
max
(
a
)
+
min
(
c
)
+
max
(
c
)
as
sum
from
t1
group
by
grp
;
select
grp
,
sum
(
a
)
+
count
(
a
)
+
avg
(
a
)
+
std
(
a
)
+
variance
(
a
)
+
bit_or
(
a
)
+
bit_and
(
a
)
+
min
(
a
)
+
max
(
a
)
+
min
(
c
)
+
max
(
c
)
as
sum
from
t1
group
by
grp
;
create
table
t2
(
grp
int
,
a
bigint
unsigned
,
c
char
(
10
));
create
table
t2
(
grp
int
,
a
bigint
unsigned
,
c
char
(
10
));
insert
into
t2
select
grp
,
max
(
a
)
+
max
(
grp
),
max
(
c
)
from
t1
group
by
grp
;
insert
into
t2
select
grp
,
max
(
a
)
+
max
(
grp
),
max
(
c
)
from
t1
group
by
grp
;
...
@@ -40,8 +40,8 @@ CREATE TABLE t1 (id int(11),value1 float(10,2));
...
@@ -40,8 +40,8 @@ CREATE TABLE t1 (id int(11),value1 float(10,2));
INSERT
INTO
t1
VALUES
(
1
,
0.00
),(
1
,
1.00
),
(
1
,
2.00
),
(
2
,
10.00
),
(
2
,
11.00
),
(
2
,
12.00
);
INSERT
INTO
t1
VALUES
(
1
,
0.00
),(
1
,
1.00
),
(
1
,
2.00
),
(
2
,
10.00
),
(
2
,
11.00
),
(
2
,
12.00
);
CREATE
TABLE
t2
(
id
int
(
11
),
name
char
(
20
));
CREATE
TABLE
t2
(
id
int
(
11
),
name
char
(
20
));
INSERT
INTO
t2
VALUES
(
1
,
'Set One'
),(
2
,
'Set Two'
);
INSERT
INTO
t2
VALUES
(
1
,
'Set One'
),(
2
,
'Set Two'
);
select
id
,
avg
(
value1
),
std
(
value1
)
from
t1
group
by
id
;
select
id
,
avg
(
value1
),
std
(
value1
)
,
variance
(
value1
)
from
t1
group
by
id
;
select
name
,
avg
(
value1
),
std
(
value1
)
from
t1
,
t2
where
t1
.
id
=
t2
.
id
group
by
t1
.
id
;
select
name
,
avg
(
value1
),
std
(
value1
)
,
variance
(
value1
)
from
t1
,
t2
where
t1
.
id
=
t2
.
id
group
by
t1
.
id
;
drop
table
t1
,
t2
;
drop
table
t1
,
t2
;
#
#
...
...
mysql-test/t/having.test
View file @
8eddd4d4
...
@@ -59,4 +59,5 @@ select Fld1, max(Fld2) as q from t1 group by Fld1 having q is not null;
...
@@ -59,4 +59,5 @@ select Fld1, max(Fld2) as q from t1 group by Fld1 having q is not null;
select
Fld1
,
max
(
Fld2
)
from
t1
group
by
Fld1
having
max
(
Fld2
)
is
not
null
;
select
Fld1
,
max
(
Fld2
)
from
t1
group
by
Fld1
having
max
(
Fld2
)
is
not
null
;
select
Fld1
,
max
(
Fld2
)
from
t1
group
by
Fld1
having
avg
(
Fld2
)
is
not
null
;
select
Fld1
,
max
(
Fld2
)
from
t1
group
by
Fld1
having
avg
(
Fld2
)
is
not
null
;
select
Fld1
,
max
(
Fld2
)
from
t1
group
by
Fld1
having
std
(
Fld2
)
is
not
null
;
select
Fld1
,
max
(
Fld2
)
from
t1
group
by
Fld1
having
std
(
Fld2
)
is
not
null
;
select
Fld1
,
max
(
Fld2
)
from
t1
group
by
Fld1
having
variance
(
Fld2
)
is
not
null
;
drop
table
t1
;
drop
table
t1
;
mysql-test/t/select.test
View file @
8eddd4d4
...
@@ -1577,8 +1577,8 @@ select fld3 from t2 where (((fld3 like "_%L%" ) or (fld3 like "%ok%")) and ( fld
...
@@ -1577,8 +1577,8 @@ select fld3 from t2 where (((fld3 like "_%L%" ) or (fld3 like "%ok%")) and ( fld
select
count
(
*
)
from
t1
;
select
count
(
*
)
from
t1
;
select
companynr
,
count
(
*
),
sum
(
fld1
)
from
t2
group
by
companynr
;
select
companynr
,
count
(
*
),
sum
(
fld1
)
from
t2
group
by
companynr
;
select
companynr
,
count
(
*
)
from
t2
group
by
companynr
order
by
companynr
desc
limit
5
;
select
companynr
,
count
(
*
)
from
t2
group
by
companynr
order
by
companynr
desc
limit
5
;
select
count
(
*
),
min
(
fld4
),
max
(
fld4
),
sum
(
fld1
),
avg
(
fld1
),
std
(
fld1
)
from
t2
where
companynr
=
34
and
fld4
<>
""
;
select
count
(
*
),
min
(
fld4
),
max
(
fld4
),
sum
(
fld1
),
avg
(
fld1
),
std
(
fld1
)
,
variance
(
fld1
)
from
t2
where
companynr
=
34
and
fld4
<>
""
;
select
companynr
,
count
(
*
),
min
(
fld4
),
max
(
fld4
),
sum
(
fld1
),
avg
(
fld1
),
std
(
fld1
)
from
t2
group
by
companynr
limit
3
;
select
companynr
,
count
(
*
),
min
(
fld4
),
max
(
fld4
),
sum
(
fld1
),
avg
(
fld1
),
std
(
fld1
)
,
variance
(
fld1
)
from
t2
group
by
companynr
limit
3
;
select
companynr
,
t2nr
,
count
(
price
),
sum
(
price
),
min
(
price
),
max
(
price
),
avg
(
price
)
from
t3
where
companynr
=
37
group
by
companynr
,
t2nr
limit
10
;
select
companynr
,
t2nr
,
count
(
price
),
sum
(
price
),
min
(
price
),
max
(
price
),
avg
(
price
)
from
t3
where
companynr
=
37
group
by
companynr
,
t2nr
limit
10
;
select
/*! SQL_SMALL_RESULT */
companynr
,
t2nr
,
count
(
price
),
sum
(
price
),
min
(
price
),
max
(
price
),
avg
(
price
)
from
t3
where
companynr
=
37
group
by
companynr
,
t2nr
limit
10
;
select
/*! SQL_SMALL_RESULT */
companynr
,
t2nr
,
count
(
price
),
sum
(
price
),
min
(
price
),
max
(
price
),
avg
(
price
)
from
t3
where
companynr
=
37
group
by
companynr
,
t2nr
limit
10
;
select
companynr
,
count
(
price
),
sum
(
price
),
min
(
price
),
max
(
price
),
avg
(
price
)
from
t3
group
by
companynr
;
select
companynr
,
count
(
price
),
sum
(
price
),
min
(
price
),
max
(
price
),
avg
(
price
)
from
t3
group
by
companynr
;
...
...
sql/item.cc
View file @
8eddd4d4
...
@@ -727,7 +727,7 @@ void Item_avg_field::make_field(Send_field *tmp_field)
...
@@ -727,7 +727,7 @@ void Item_avg_field::make_field(Send_field *tmp_field)
init_make_field
(
tmp_field
,
FIELD_TYPE_DOUBLE
);
init_make_field
(
tmp_field
,
FIELD_TYPE_DOUBLE
);
}
}
void
Item_
std
_field
::
make_field
(
Send_field
*
tmp_field
)
void
Item_
variance
_field
::
make_field
(
Send_field
*
tmp_field
)
{
{
init_make_field
(
tmp_field
,
FIELD_TYPE_DOUBLE
);
init_make_field
(
tmp_field
,
FIELD_TYPE_DOUBLE
);
}
}
...
...
sql/item.h
View file @
8eddd4d4
...
@@ -33,7 +33,8 @@ class Item {
...
@@ -33,7 +33,8 @@ class Item {
enum
Type
{
FIELD_ITEM
,
FUNC_ITEM
,
SUM_FUNC_ITEM
,
STRING_ITEM
,
enum
Type
{
FIELD_ITEM
,
FUNC_ITEM
,
SUM_FUNC_ITEM
,
STRING_ITEM
,
INT_ITEM
,
REAL_ITEM
,
NULL_ITEM
,
VARBIN_ITEM
,
INT_ITEM
,
REAL_ITEM
,
NULL_ITEM
,
VARBIN_ITEM
,
COPY_STR_ITEM
,
FIELD_AVG_ITEM
,
DEFAULT_ITEM
,
COPY_STR_ITEM
,
FIELD_AVG_ITEM
,
DEFAULT_ITEM
,
PROC_ITEM
,
COND_ITEM
,
REF_ITEM
,
FIELD_STD_ITEM
,
CONST_ITEM
,
PROC_ITEM
,
COND_ITEM
,
REF_ITEM
,
FIELD_STD_ITEM
,
FIELD_VARIANCE_ITEM
,
CONST_ITEM
,
SUBSELECT_ITEM
,
ROW_ITEM
};
SUBSELECT_ITEM
,
ROW_ITEM
};
enum
cond_result
{
COND_UNDEF
,
COND_OK
,
COND_TRUE
,
COND_FALSE
};
enum
cond_result
{
COND_UNDEF
,
COND_OK
,
COND_TRUE
,
COND_FALSE
};
...
...
sql/item_sum.cc
View file @
8eddd4d4
...
@@ -253,12 +253,24 @@ double Item_sum_avg::val()
...
@@ -253,12 +253,24 @@ double Item_sum_avg::val()
** Standard deviation
** Standard deviation
*/
*/
void
Item_sum_std
::
reset
()
double
Item_sum_std
::
val
()
{
{
sum
=
sum_sqr
=
0.0
;
count
=
0
;
(
void
)
Item_sum_std
::
add
();
double
tmp
=
Item_sum_variance
::
val
();
return
tmp
<=
0.0
?
0.0
:
sqrt
(
tmp
);
}
}
bool
Item_sum_std
::
add
()
/*
** variance
*/
void
Item_sum_variance
::
reset
()
{
sum
=
sum_sqr
=
0.0
;
count
=
0
;
(
void
)
Item_sum_variance
::
add
();
}
bool
Item_sum_variance
::
add
()
{
{
double
nr
=
args
[
0
]
->
val
();
double
nr
=
args
[
0
]
->
val
();
if
(
!
args
[
0
]
->
null_value
)
if
(
!
args
[
0
]
->
null_value
)
...
@@ -270,7 +282,7 @@ bool Item_sum_std::add()
...
@@ -270,7 +282,7 @@ bool Item_sum_std::add()
return
0
;
return
0
;
}
}
double
Item_sum_
std
::
val
()
double
Item_sum_
variance
::
val
()
{
{
if
(
!
count
)
if
(
!
count
)
{
{
...
@@ -281,11 +293,10 @@ double Item_sum_std::val()
...
@@ -281,11 +293,10 @@ double Item_sum_std::val()
/* Avoid problems when the precision isn't good enough */
/* Avoid problems when the precision isn't good enough */
double
tmp
=
ulonglong2double
(
count
);
double
tmp
=
ulonglong2double
(
count
);
double
tmp2
=
(
sum_sqr
-
sum
*
sum
/
tmp
)
/
tmp
;
double
tmp2
=
(
sum_sqr
-
sum
*
sum
/
tmp
)
/
tmp
;
return
tmp2
<=
0.0
?
0.0
:
sqrt
(
tmp2
)
;
return
tmp2
<=
0.0
?
0.0
:
tmp2
;
}
}
void
Item_sum_variance
::
reset_field
()
void
Item_sum_std
::
reset_field
()
{
{
double
nr
=
args
[
0
]
->
val
();
double
nr
=
args
[
0
]
->
val
();
char
*
res
=
result_field
->
ptr
;
char
*
res
=
result_field
->
ptr
;
...
@@ -302,7 +313,7 @@ void Item_sum_std::reset_field()
...
@@ -302,7 +313,7 @@ void Item_sum_std::reset_field()
}
}
}
}
void
Item_sum_
std
::
update_field
(
int
offset
)
void
Item_sum_
variance
::
update_field
(
int
offset
)
{
{
double
nr
,
old_nr
,
old_sqr
;
double
nr
,
old_nr
,
old_sqr
;
longlong
field_count
;
longlong
field_count
;
...
@@ -836,6 +847,17 @@ String *Item_avg_field::val_str(String *str)
...
@@ -836,6 +847,17 @@ String *Item_avg_field::val_str(String *str)
}
}
Item_std_field
::
Item_std_field
(
Item_sum_std
*
item
)
Item_std_field
::
Item_std_field
(
Item_sum_std
*
item
)
:
Item_variance_field
(
item
)
{
}
double
Item_std_field
::
val
()
{
double
tmp
=
Item_variance_field
::
val
();
return
tmp
<=
0.0
?
0.0
:
sqrt
(
tmp
);
}
Item_variance_field
::
Item_variance_field
(
Item_sum_variance
*
item
)
{
{
name
=
item
->
name
;
name
=
item
->
name
;
decimals
=
item
->
decimals
;
decimals
=
item
->
decimals
;
...
@@ -844,7 +866,7 @@ Item_std_field::Item_std_field(Item_sum_std *item)
...
@@ -844,7 +866,7 @@ Item_std_field::Item_std_field(Item_sum_std *item)
maybe_null
=
1
;
maybe_null
=
1
;
}
}
double
Item_
std
_field
::
val
()
double
Item_
variance
_field
::
val
()
{
{
double
sum
,
sum_sqr
;
double
sum
,
sum_sqr
;
longlong
count
;
longlong
count
;
...
@@ -860,10 +882,10 @@ double Item_std_field::val()
...
@@ -860,10 +882,10 @@ double Item_std_field::val()
null_value
=
0
;
null_value
=
0
;
double
tmp
=
(
double
)
count
;
double
tmp
=
(
double
)
count
;
double
tmp2
=
(
sum_sqr
-
sum
*
sum
/
tmp
)
/
tmp
;
double
tmp2
=
(
sum_sqr
-
sum
*
sum
/
tmp
)
/
tmp
;
return
tmp2
<=
0.0
?
0.0
:
sqrt
(
tmp2
)
;
return
tmp2
<=
0.0
?
0.0
:
tmp2
;
}
}
String
*
Item_
std
_field
::
val_str
(
String
*
str
)
String
*
Item_
variance
_field
::
val_str
(
String
*
str
)
{
{
double
nr
=
val
();
double
nr
=
val
();
if
(
null_value
)
if
(
null_value
)
...
...
sql/item_sum.h
View file @
8eddd4d4
...
@@ -27,7 +27,7 @@ class Item_sum :public Item_result_field
...
@@ -27,7 +27,7 @@ class Item_sum :public Item_result_field
{
{
public:
public:
enum
Sumfunctype
{
COUNT_FUNC
,
COUNT_DISTINCT_FUNC
,
SUM_FUNC
,
AVG_FUNC
,
MIN_FUNC
,
enum
Sumfunctype
{
COUNT_FUNC
,
COUNT_DISTINCT_FUNC
,
SUM_FUNC
,
AVG_FUNC
,
MIN_FUNC
,
MAX_FUNC
,
UNIQUE_USERS_FUNC
,
STD_FUNC
,
SUM_BIT_FUNC
,
MAX_FUNC
,
UNIQUE_USERS_FUNC
,
STD_FUNC
,
VARIANCE_FUNC
,
SUM_BIT_FUNC
,
UDF_SUM_FUNC
};
UDF_SUM_FUNC
};
Item
**
args
,
*
tmp_args
[
2
];
Item
**
args
,
*
tmp_args
[
2
];
...
@@ -235,14 +235,14 @@ class Item_sum_avg :public Item_sum_num
...
@@ -235,14 +235,14 @@ class Item_sum_avg :public Item_sum_num
const
char
*
func_name
()
const
{
return
"avg"
;
}
const
char
*
func_name
()
const
{
return
"avg"
;
}
};
};
class
Item_sum_
std
;
class
Item_sum_
variance
;
class
Item_
std
_field
:
public
Item_result_field
class
Item_
variance
_field
:
public
Item_result_field
{
{
public:
public:
Field
*
field
;
Field
*
field
;
Item_
std_field
(
Item_sum_std
*
item
);
Item_
variance_field
(
Item_sum_variance
*
item
);
enum
Type
type
()
const
{
return
FIELD_STD
_ITEM
;
}
enum
Type
type
()
const
{
return
FIELD_VARIANCE
_ITEM
;
}
double
val
();
double
val
();
longlong
val_int
()
{
return
(
longlong
)
val
();
}
longlong
val_int
()
{
return
(
longlong
)
val
();
}
String
*
val_str
(
String
*
);
String
*
val_str
(
String
*
);
...
@@ -251,26 +251,59 @@ class Item_std_field :public Item_result_field
...
@@ -251,26 +251,59 @@ class Item_std_field :public Item_result_field
void
fix_length_and_dec
()
{}
void
fix_length_and_dec
()
{}
};
};
class
Item_sum_std
:
public
Item_sum_num
/*
variance(a) =
= sqrt ( sum (ai - avg(a))^2 / count(a) )
= sqrt ( sum (ai^2 - 2*ai*avg(a) + avg(a)^2) / count(a) )
= sqrt ( (sum(ai^2) - sum(2*ai*avg(a)) + sum(avg(a)^2))/count(a) ) =
= sqrt ( (sum(ai^2) - 2*avg(a)*sum(a) + count(a)*avg(a)^2)/count(a) ) =
= sqrt ( (sum(ai^2) - 2*sum(a)*sum(a)/count(a) + count(a)*sum(a)^2/count(a)^2 )/count(a) ) =
= sqrt ( (sum(ai^2) - 2*sum(a)^2/count(a) + sum(a)^2/count(a) )/count(a) ) =
= sqrt ( (sum(ai^2) - sum(a)^2/count(a))/count(a) )
*/
class
Item_sum_variance
:
public
Item_sum_num
{
{
double
sum
;
double
sum
,
sum_sqr
;
double
sum_sqr
;
ulonglong
count
;
ulonglong
count
;
void
fix_length_and_dec
()
{
decimals
+=
4
;
maybe_null
=
1
;
}
void
fix_length_and_dec
()
{
decimals
+=
4
;
maybe_null
=
1
;
}
public:
public:
Item_sum_
std
(
Item
*
item_par
)
:
Item_sum_num
(
item_par
),
count
(
0
)
{}
Item_sum_
variance
(
Item
*
item_par
)
:
Item_sum_num
(
item_par
),
count
(
0
)
{}
enum
Sumfunctype
sum_func
()
const
{
return
STD
_FUNC
;
}
enum
Sumfunctype
sum_func
()
const
{
return
VARIANCE
_FUNC
;
}
void
reset
();
void
reset
();
bool
add
();
bool
add
();
double
val
();
double
val
();
void
reset_field
();
void
reset_field
();
void
update_field
(
int
offset
);
void
update_field
(
int
offset
);
Item
*
result_item
(
Field
*
field
)
Item
*
result_item
(
Field
*
field
)
{
return
new
Item_
std
_field
(
this
);
}
{
return
new
Item_
variance
_field
(
this
);
}
const
char
*
func_name
()
const
{
return
"
std
"
;
}
const
char
*
func_name
()
const
{
return
"
variance
"
;
}
};
};
class
Item_sum_std
;
class
Item_std_field
:
public
Item_variance_field
{
public:
Item_std_field
(
Item_sum_std
*
item
);
enum
Type
type
()
const
{
return
FIELD_STD_ITEM
;
}
double
val
();
};
class
Item_sum_std
:
public
Item_sum_variance
{
public:
Item_sum_std
(
Item
*
item_par
)
:
Item_sum_variance
(
item_par
){}
enum
Sumfunctype
sum_func
()
const
{
return
STD_FUNC
;
}
double
val
();
Item
*
result_item
(
Field
*
field
)
{
return
new
Item_std_field
(
this
);
}
const
char
*
func_name
()
const
{
return
"std"
;
}
};
// This class is a string or number function depending on num_func
// This class is a string or number function depending on num_func
...
...
sql/lex.h
View file @
8eddd4d4
...
@@ -585,6 +585,7 @@ static SYMBOL sql_functions[] = {
...
@@ -585,6 +585,7 @@ static SYMBOL sql_functions[] = {
{
"UNIX_TIMESTAMP"
,
SYM
(
UNIX_TIMESTAMP
),
0
,
0
},
{
"UNIX_TIMESTAMP"
,
SYM
(
UNIX_TIMESTAMP
),
0
,
0
},
{
"UPPER"
,
SYM
(
FUNC_ARG1
),
0
,
CREATE_FUNC
(
create_func_ucase
)},
{
"UPPER"
,
SYM
(
FUNC_ARG1
),
0
,
CREATE_FUNC
(
create_func_ucase
)},
{
"USER"
,
SYM
(
USER
),
0
,
0
},
{
"USER"
,
SYM
(
USER
),
0
,
0
},
{
"VARIANCE"
,
SYM
(
VARIANCE_SYM
),
0
,
0
},
{
"VERSION"
,
SYM
(
FUNC_ARG0
),
0
,
CREATE_FUNC
(
create_func_version
)},
{
"VERSION"
,
SYM
(
FUNC_ARG0
),
0
,
CREATE_FUNC
(
create_func_version
)},
{
"WEEK"
,
SYM
(
WEEK_SYM
),
0
,
0
},
{
"WEEK"
,
SYM
(
WEEK_SYM
),
0
,
0
},
{
"WEEKDAY"
,
SYM
(
FUNC_ARG1
),
0
,
CREATE_FUNC
(
create_func_weekday
)},
{
"WEEKDAY"
,
SYM
(
FUNC_ARG1
),
0
,
CREATE_FUNC
(
create_func_weekday
)},
...
...
sql/sql_select.cc
View file @
8eddd4d4
...
@@ -3783,13 +3783,14 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
...
@@ -3783,13 +3783,14 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
else
else
return
new
Field_double
(
item_sum
->
max_length
,
maybe_null
,
return
new
Field_double
(
item_sum
->
max_length
,
maybe_null
,
item
->
name
,
table
,
item_sum
->
decimals
);
item
->
name
,
table
,
item_sum
->
decimals
);
case
Item_sum
:
:
STD_FUNC
:
/* Place for sum & count */
case
Item_sum
:
:
VARIANCE_FUNC
:
/* Place for sum & count */
case
Item_sum
:
:
STD_FUNC
:
if
(
group
)
if
(
group
)
return
new
Field_string
(
sizeof
(
double
)
*
2
+
sizeof
(
longlong
),
return
new
Field_string
(
sizeof
(
double
)
*
2
+
sizeof
(
longlong
),
maybe_null
,
item
->
name
,
table
,
my_charset_bin
);
maybe_null
,
item
->
name
,
table
,
my_charset_bin
);
else
else
return
new
Field_double
(
item_sum
->
max_length
,
maybe_null
,
return
new
Field_double
(
item_sum
->
max_length
,
maybe_null
,
item
->
name
,
table
,
item_sum
->
decimals
);
item
->
name
,
table
,
item_sum
->
decimals
);
case
Item_sum
:
:
UNIQUE_USERS_FUNC
:
case
Item_sum
:
:
UNIQUE_USERS_FUNC
:
return
new
Field_long
(
9
,
maybe_null
,
item
->
name
,
table
,
1
);
return
new
Field_long
(
9
,
maybe_null
,
item
->
name
,
table
,
1
);
default:
default:
...
...
sql/sql_yacc.yy
View file @
8eddd4d4
...
@@ -159,6 +159,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
...
@@ -159,6 +159,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token SQL_THREAD
%token SQL_THREAD
%token START_SYM
%token START_SYM
%token STD_SYM
%token STD_SYM
%token VARIANCE_SYM
%token STOP_SYM
%token STOP_SYM
%token SUM_SYM
%token SUM_SYM
%token SUPER_SYM
%token SUPER_SYM
...
@@ -2339,6 +2340,8 @@ sum_expr:
...
@@ -2339,6 +2340,8 @@ sum_expr:
{ $$=new Item_sum_max($3); }
{ $$=new Item_sum_max($3); }
| STD_SYM '(' in_sum_expr ')'
| STD_SYM '(' in_sum_expr ')'
{ $$=new Item_sum_std($3); }
{ $$=new Item_sum_std($3); }
| VARIANCE_SYM '(' in_sum_expr ')'
{ $$=new Item_sum_variance($3); }
| SUM_SYM '(' in_sum_expr ')'
| SUM_SYM '(' in_sum_expr ')'
{ $$=new Item_sum_sum($3); };
{ $$=new Item_sum_sum($3); };
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment