mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
Merge sanja.is.com.ua:/home/bell/mysql/bk/mysql-4.1
into sanja.is.com.ua:/home/bell/mysql/bk/work-4.1
This commit is contained in:
@@ -1899,3 +1899,24 @@ select t000.a, count(*) `C` FROM t1 t000 GROUP BY t000.a HAVING count(*) > ALL (
|
||||
a C
|
||||
1 1
|
||||
drop table t1,t2;
|
||||
CREATE TABLE `t1` ( `aid` int(11) NOT NULL default '0', `bid` int(11) NOT NULL default '0', PRIMARY KEY (`aid`,`bid`));
|
||||
CREATE TABLE `t2` ( `aid` int(11) NOT NULL default '0', `bid` int(11) NOT NULL default '0', PRIMARY KEY (`aid`,`bid`));
|
||||
insert into t1 values (1,1),(1,2),(2,1),(2,2);
|
||||
insert into t2 values (1,2),(2,2);
|
||||
select * from t1 where t1.aid not in (select aid from t2 where bid=t1.bid);
|
||||
aid bid
|
||||
1 1
|
||||
2 1
|
||||
alter table t2 drop primary key;
|
||||
alter table t2 add key KEY1 (aid, bid);
|
||||
select * from t1 where t1.aid not in (select aid from t2 where bid=t1.bid);
|
||||
aid bid
|
||||
1 1
|
||||
2 1
|
||||
alter table t2 drop key KEY1;
|
||||
alter table t2 add primary key (bid, aid);
|
||||
select * from t1 where t1.aid not in (select aid from t2 where bid=t1.bid);
|
||||
aid bid
|
||||
1 1
|
||||
2 1
|
||||
drop table t1,t2;
|
||||
|
||||
@@ -1222,3 +1222,19 @@ CREATE TABLE `t2` ( `b` int(11) default NULL, `a` int(11) default NULL) ENGINE=M
|
||||
insert into t2 values (1,2);
|
||||
select t000.a, count(*) `C` FROM t1 t000 GROUP BY t000.a HAVING count(*) > ALL (SELECT count(*) FROM t2 t001 WHERE t001.a=1);
|
||||
drop table t1,t2;
|
||||
|
||||
#
|
||||
# Optimized IN with compound index
|
||||
#
|
||||
CREATE TABLE `t1` ( `aid` int(11) NOT NULL default '0', `bid` int(11) NOT NULL default '0', PRIMARY KEY (`aid`,`bid`));
|
||||
CREATE TABLE `t2` ( `aid` int(11) NOT NULL default '0', `bid` int(11) NOT NULL default '0', PRIMARY KEY (`aid`,`bid`));
|
||||
insert into t1 values (1,1),(1,2),(2,1),(2,2);
|
||||
insert into t2 values (1,2),(2,2);
|
||||
select * from t1 where t1.aid not in (select aid from t2 where bid=t1.bid);
|
||||
alter table t2 drop primary key;
|
||||
alter table t2 add key KEY1 (aid, bid);
|
||||
select * from t1 where t1.aid not in (select aid from t2 where bid=t1.bid);
|
||||
alter table t2 drop key KEY1;
|
||||
alter table t2 add primary key (bid, aid);
|
||||
select * from t1 where t1.aid not in (select aid from t2 where bid=t1.bid);
|
||||
drop table t1,t2;
|
||||
|
||||
@@ -1243,29 +1243,31 @@ int subselect_uniquesubquery_engine::exec()
|
||||
DBUG_ENTER("subselect_uniquesubquery_engine::exec");
|
||||
int error;
|
||||
TABLE *table= tab->table;
|
||||
if ((tab->ref.key_err= (*tab->ref.key_copy)->copy()))
|
||||
for (store_key **copy=tab->ref.key_copy ; *copy ; copy++)
|
||||
{
|
||||
table->status= STATUS_NOT_FOUND;
|
||||
error= -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!table->file->inited)
|
||||
table->file->ha_index_init(tab->ref.key);
|
||||
error= table->file->index_read(table->record[0],
|
||||
tab->ref.key_buff,
|
||||
tab->ref.key_length,HA_READ_KEY_EXACT);
|
||||
if (error && error != HA_ERR_KEY_NOT_FOUND)
|
||||
error= report_error(table, error);
|
||||
else
|
||||
if (tab->ref.key_err= (*copy)->copy())
|
||||
{
|
||||
error= 0;
|
||||
table->null_row= 0;
|
||||
((Item_in_subselect *) item)->value= (!table->status &&
|
||||
(!cond || cond->val_int()) ? 1 :
|
||||
0);
|
||||
table->status= STATUS_NOT_FOUND;
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (!table->file->inited)
|
||||
table->file->ha_index_init(tab->ref.key);
|
||||
error= table->file->index_read(table->record[0],
|
||||
tab->ref.key_buff,
|
||||
tab->ref.key_length,HA_READ_KEY_EXACT);
|
||||
if (error && error != HA_ERR_KEY_NOT_FOUND)
|
||||
error= report_error(table, error);
|
||||
else
|
||||
{
|
||||
error= 0;
|
||||
table->null_row= 0;
|
||||
((Item_in_subselect *) item)->value= (!table->status &&
|
||||
(!cond || cond->val_int()) ? 1 :
|
||||
0);
|
||||
}
|
||||
|
||||
DBUG_RETURN(error != 0);
|
||||
}
|
||||
|
||||
@@ -1293,55 +1295,56 @@ int subselect_indexsubquery_engine::exec()
|
||||
((Item_in_subselect *) item)->was_null= 0;
|
||||
}
|
||||
|
||||
if ((*tab->ref.key_copy) && (tab->ref.key_err= (*tab->ref.key_copy)->copy()))
|
||||
for (store_key **copy=tab->ref.key_copy ; *copy ; copy++)
|
||||
{
|
||||
table->status= STATUS_NOT_FOUND;
|
||||
error= -1;
|
||||
if (tab->ref.key_err= (*copy)->copy())
|
||||
{
|
||||
table->status= STATUS_NOT_FOUND;
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (!table->file->inited)
|
||||
table->file->ha_index_init(tab->ref.key);
|
||||
error= table->file->index_read(table->record[0],
|
||||
tab->ref.key_buff,
|
||||
tab->ref.key_length,HA_READ_KEY_EXACT);
|
||||
if (error && error != HA_ERR_KEY_NOT_FOUND)
|
||||
error= report_error(table, error);
|
||||
else
|
||||
{
|
||||
if (!table->file->inited)
|
||||
table->file->ha_index_init(tab->ref.key);
|
||||
error= table->file->index_read(table->record[0],
|
||||
tab->ref.key_buff,
|
||||
tab->ref.key_length,HA_READ_KEY_EXACT);
|
||||
if (error && error != HA_ERR_KEY_NOT_FOUND)
|
||||
error= report_error(table, error);
|
||||
else
|
||||
for (;;)
|
||||
{
|
||||
for (;;)
|
||||
error= 0;
|
||||
table->null_row= 0;
|
||||
if (!table->status)
|
||||
{
|
||||
error= 0;
|
||||
table->null_row= 0;
|
||||
if (!table->status)
|
||||
{
|
||||
if (!cond || cond->val_int())
|
||||
{
|
||||
if (null_finding)
|
||||
((Item_in_subselect *) item)->was_null= 1;
|
||||
else
|
||||
((Item_in_subselect *) item)->value= 1;
|
||||
break;
|
||||
}
|
||||
error= table->file->index_next_same(table->record[0],
|
||||
tab->ref.key_buff,
|
||||
tab->ref.key_length);
|
||||
if (error && error != HA_ERR_END_OF_FILE)
|
||||
{
|
||||
error= report_error(table, error);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!check_null || null_finding)
|
||||
break; /* We don't need to check nulls */
|
||||
*tab->ref.null_ref_key= 1;
|
||||
null_finding= 1;
|
||||
/* Check if there exists a row with a null value in the index */
|
||||
if ((error= (safe_index_read(tab) == 1)))
|
||||
break;
|
||||
}
|
||||
if (!cond || cond->val_int())
|
||||
{
|
||||
if (null_finding)
|
||||
((Item_in_subselect *) item)->was_null= 1;
|
||||
else
|
||||
((Item_in_subselect *) item)->value= 1;
|
||||
break;
|
||||
}
|
||||
error= table->file->index_next_same(table->record[0],
|
||||
tab->ref.key_buff,
|
||||
tab->ref.key_length);
|
||||
if (error && error != HA_ERR_END_OF_FILE)
|
||||
{
|
||||
error= report_error(table, error);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!check_null || null_finding)
|
||||
break; /* We don't need to check nulls */
|
||||
*tab->ref.null_ref_key= 1;
|
||||
null_finding= 1;
|
||||
/* Check if there exists a row with a null value in the index */
|
||||
if ((error= (safe_index_read(tab) == 1)))
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user