Merge rurik.mysql.com:/home/igor/dev/mysql-5.0-0
into rurik.mysql.com:/home/igor/dev/mysql-5.1-0 sql/item.cc: Auto merged sql/opt_sum.cc: Auto merged
This commit is contained in:
commit
d26bf308bd
@ -359,3 +359,38 @@ group by s1 collate latin1_swedish_ci having s1 = 'y';
|
|||||||
s1 count(s1)
|
s1 count(s1)
|
||||||
y 1
|
y 1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
DROP SCHEMA IF EXISTS HU;
|
||||||
|
Warnings:
|
||||||
|
Note 1008 Can't drop database 'HU'; database doesn't exist
|
||||||
|
CREATE SCHEMA HU ;
|
||||||
|
USE HU ;
|
||||||
|
CREATE TABLE STAFF
|
||||||
|
(EMPNUM CHAR(3) NOT NULL UNIQUE,
|
||||||
|
EMPNAME CHAR(20),
|
||||||
|
GRADE DECIMAL(4),
|
||||||
|
CITY CHAR(15));
|
||||||
|
CREATE TABLE PROJ
|
||||||
|
(PNUM CHAR(3) NOT NULL UNIQUE,
|
||||||
|
PNAME CHAR(20),
|
||||||
|
PTYPE CHAR(6),
|
||||||
|
BUDGET DECIMAL(9),
|
||||||
|
CITY CHAR(15));
|
||||||
|
INSERT INTO STAFF VALUES ('E1','Alice',12,'Deale');
|
||||||
|
INSERT INTO STAFF VALUES ('E2','Betty',10,'Vienna');
|
||||||
|
INSERT INTO STAFF VALUES ('E3','Carmen',13,'Vienna');
|
||||||
|
INSERT INTO STAFF VALUES ('E4','Don',12,'Deale');
|
||||||
|
INSERT INTO STAFF VALUES ('E5','Ed',13,'Akron');
|
||||||
|
INSERT INTO PROJ VALUES ('P1','MXSS','Design',10000,'Deale');
|
||||||
|
INSERT INTO PROJ VALUES ('P2','CALM','Code',30000,'Vienna');
|
||||||
|
INSERT INTO PROJ VALUES ('P3','SDP','Test',30000,'Tampa');
|
||||||
|
INSERT INTO PROJ VALUES ('P4','SDP','Design',20000,'Deale');
|
||||||
|
INSERT INTO PROJ VALUES ('P5','IRM','Test',10000,'Vienna');
|
||||||
|
INSERT INTO PROJ VALUES ('P6','PAYR','Design',50000,'Deale');
|
||||||
|
SELECT EMPNUM, GRADE*1000
|
||||||
|
FROM HU.STAFF WHERE GRADE * 1000 >
|
||||||
|
ANY (SELECT SUM(BUDGET) FROM HU.PROJ
|
||||||
|
GROUP BY CITY, PTYPE
|
||||||
|
HAVING HU.PROJ.CITY = HU.STAFF.CITY);
|
||||||
|
EMPNUM GRADE*1000
|
||||||
|
E3 13000
|
||||||
|
DROP SCHEMA HU;
|
||||||
|
@ -347,3 +347,47 @@ group by s1 collate latin1_swedish_ci having s1 = 'y';
|
|||||||
# MySQL returns: 1 row, with count(s1) = 1
|
# MySQL returns: 1 row, with count(s1) = 1
|
||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #15917: unexpected complain for a name in having clause
|
||||||
|
# when the server is run on Windows or with --lower-case-table-names=1
|
||||||
|
#
|
||||||
|
|
||||||
|
DROP SCHEMA IF EXISTS HU;
|
||||||
|
CREATE SCHEMA HU ;
|
||||||
|
USE HU ;
|
||||||
|
|
||||||
|
CREATE TABLE STAFF
|
||||||
|
(EMPNUM CHAR(3) NOT NULL UNIQUE,
|
||||||
|
EMPNAME CHAR(20),
|
||||||
|
GRADE DECIMAL(4),
|
||||||
|
CITY CHAR(15));
|
||||||
|
|
||||||
|
CREATE TABLE PROJ
|
||||||
|
(PNUM CHAR(3) NOT NULL UNIQUE,
|
||||||
|
PNAME CHAR(20),
|
||||||
|
PTYPE CHAR(6),
|
||||||
|
BUDGET DECIMAL(9),
|
||||||
|
CITY CHAR(15));
|
||||||
|
|
||||||
|
INSERT INTO STAFF VALUES ('E1','Alice',12,'Deale');
|
||||||
|
INSERT INTO STAFF VALUES ('E2','Betty',10,'Vienna');
|
||||||
|
INSERT INTO STAFF VALUES ('E3','Carmen',13,'Vienna');
|
||||||
|
INSERT INTO STAFF VALUES ('E4','Don',12,'Deale');
|
||||||
|
INSERT INTO STAFF VALUES ('E5','Ed',13,'Akron');
|
||||||
|
|
||||||
|
INSERT INTO PROJ VALUES ('P1','MXSS','Design',10000,'Deale');
|
||||||
|
INSERT INTO PROJ VALUES ('P2','CALM','Code',30000,'Vienna');
|
||||||
|
INSERT INTO PROJ VALUES ('P3','SDP','Test',30000,'Tampa');
|
||||||
|
INSERT INTO PROJ VALUES ('P4','SDP','Design',20000,'Deale');
|
||||||
|
INSERT INTO PROJ VALUES ('P5','IRM','Test',10000,'Vienna');
|
||||||
|
INSERT INTO PROJ VALUES ('P6','PAYR','Design',50000,'Deale');
|
||||||
|
|
||||||
|
SELECT EMPNUM, GRADE*1000
|
||||||
|
FROM HU.STAFF WHERE GRADE * 1000 >
|
||||||
|
ANY (SELECT SUM(BUDGET) FROM HU.PROJ
|
||||||
|
GROUP BY CITY, PTYPE
|
||||||
|
HAVING HU.PROJ.CITY = HU.STAFF.CITY);
|
||||||
|
|
||||||
|
DROP SCHEMA HU;
|
||||||
|
@ -3061,6 +3061,7 @@ static Item** find_field_in_group_list(Item *find_item, ORDER *group_list)
|
|||||||
int found_match_degree= 0;
|
int found_match_degree= 0;
|
||||||
Item_ident *cur_field;
|
Item_ident *cur_field;
|
||||||
int cur_match_degree= 0;
|
int cur_match_degree= 0;
|
||||||
|
char name_buff[NAME_LEN+1];
|
||||||
|
|
||||||
if (find_item->type() == Item::FIELD_ITEM ||
|
if (find_item->type() == Item::FIELD_ITEM ||
|
||||||
find_item->type() == Item::REF_ITEM)
|
find_item->type() == Item::REF_ITEM)
|
||||||
@ -3072,6 +3073,14 @@ static Item** find_field_in_group_list(Item *find_item, ORDER *group_list)
|
|||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (db_name && lower_case_table_names)
|
||||||
|
{
|
||||||
|
/* Convert database to lower case for comparison */
|
||||||
|
strmake(name_buff, db_name, sizeof(name_buff)-1);
|
||||||
|
my_casedn_str(files_charset_info, name_buff);
|
||||||
|
db_name= name_buff;
|
||||||
|
}
|
||||||
|
|
||||||
DBUG_ASSERT(field_name != 0);
|
DBUG_ASSERT(field_name != 0);
|
||||||
|
|
||||||
for (ORDER *cur_group= group_list ; cur_group ; cur_group= cur_group->next)
|
for (ORDER *cur_group= group_list ; cur_group ; cur_group= cur_group->next)
|
||||||
|
@ -123,8 +123,11 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
|||||||
If the storage manager of 'tl' gives exact row count, compute the total
|
If the storage manager of 'tl' gives exact row count, compute the total
|
||||||
number of rows. If there are no outer table dependencies, this count
|
number of rows. If there are no outer table dependencies, this count
|
||||||
may be used as the real count.
|
may be used as the real count.
|
||||||
|
Schema tables are filled after this function is invoked, so we can't
|
||||||
|
get row count
|
||||||
*/
|
*/
|
||||||
if (tl->table->file->table_flags() & HA_NOT_EXACT_COUNT)
|
if ((tl->table->file->table_flags() & HA_NOT_EXACT_COUNT) ||
|
||||||
|
tl->schema_table)
|
||||||
{
|
{
|
||||||
is_exact_count= FALSE;
|
is_exact_count= FALSE;
|
||||||
count= 1; // ensure count != 0
|
count= 1; // ensure count != 0
|
||||||
@ -149,32 +152,16 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
|||||||
switch (item_sum->sum_func()) {
|
switch (item_sum->sum_func()) {
|
||||||
case Item_sum::COUNT_FUNC:
|
case Item_sum::COUNT_FUNC:
|
||||||
/*
|
/*
|
||||||
If the expr in count(expr) can never be null we can change this
|
If the expr in COUNT(expr) can never be null we can change this
|
||||||
to the number of rows in the tables if this number is exact and
|
to the number of rows in the tables if this number is exact and
|
||||||
there are no outer joins.
|
there are no outer joins.
|
||||||
*/
|
*/
|
||||||
if (!conds && !((Item_sum_count*) item)->args[0]->maybe_null &&
|
if (!conds && !((Item_sum_count*) item)->args[0]->maybe_null &&
|
||||||
!outer_tables && is_exact_count)
|
!outer_tables && is_exact_count)
|
||||||
{
|
|
||||||
longlong count= 1;
|
|
||||||
TABLE_LIST *table;
|
|
||||||
for (table= tables; table; table= table->next_leaf)
|
|
||||||
{
|
|
||||||
if (outer_tables || (table->table->file->table_flags() &
|
|
||||||
HA_NOT_EXACT_COUNT) || table->schema_table)
|
|
||||||
{
|
|
||||||
const_result= 0; // Can't optimize left join
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tables->table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
|
|
||||||
count*= table->table->file->records;
|
|
||||||
}
|
|
||||||
if (!table)
|
|
||||||
{
|
{
|
||||||
((Item_sum_count*) item)->make_const(count);
|
((Item_sum_count*) item)->make_const(count);
|
||||||
recalc_const_item= 1;
|
recalc_const_item= 1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
const_result= 0;
|
const_result= 0;
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user