mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge sanja.is.com.ua:/home/bell/mysql/bk/mysql-5.0
into sanja.is.com.ua:/home/bell/mysql/bk/work-bug4-5.0
This commit is contained in:
@ -172,3 +172,75 @@ group by country;
|
|||||||
countrycount smcnt country total_funds
|
countrycount smcnt country total_funds
|
||||||
1 1200 USA 1200
|
1 1200 USA 1200
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE `t1` (
|
||||||
|
`t3_id` int NOT NULL,
|
||||||
|
`t1_id` int NOT NULL,
|
||||||
|
PRIMARY KEY (`t1_id`)
|
||||||
|
);
|
||||||
|
CREATE TABLE `t2` (
|
||||||
|
`t2_id` int NOT NULL,
|
||||||
|
`t1_id` int NOT NULL,
|
||||||
|
`b` int NOT NULL,
|
||||||
|
PRIMARY KEY (`t2_id`),
|
||||||
|
UNIQUE KEY `idx_t2_t1_b` (`t1_id`,`b`)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE `t3` (
|
||||||
|
`t3_id` int NOT NULL
|
||||||
|
);
|
||||||
|
INSERT INTO `t3` VALUES (3);
|
||||||
|
select
|
||||||
|
(SELECT rs.t2_id
|
||||||
|
FROM t2 rs
|
||||||
|
WHERE rs.t1_id=
|
||||||
|
(SELECT lt.t1_id
|
||||||
|
FROM t1 lt
|
||||||
|
WHERE lt.t3_id=a.t3_id)
|
||||||
|
ORDER BY b DESC LIMIT 1)
|
||||||
|
from t3 AS a;
|
||||||
|
(SELECT rs.t2_id
|
||||||
|
FROM t2 rs
|
||||||
|
WHERE rs.t1_id=
|
||||||
|
(SELECT lt.t1_id
|
||||||
|
FROM t1 lt
|
||||||
|
WHERE lt.t3_id=a.t3_id)
|
||||||
|
ORDER BY b DESC LIMIT 1)
|
||||||
|
NULL
|
||||||
|
DROP PROCEDURE IF EXISTS p1;
|
||||||
|
create procedure p1()
|
||||||
|
begin
|
||||||
|
declare done int default 3;
|
||||||
|
repeat
|
||||||
|
select
|
||||||
|
(SELECT rs.t2_id
|
||||||
|
FROM t2 rs
|
||||||
|
WHERE rs.t1_id=
|
||||||
|
(SELECT lt.t1_id
|
||||||
|
FROM t1 lt
|
||||||
|
WHERE lt.t3_id=a.t3_id)
|
||||||
|
ORDER BY b DESC LIMIT 1) as x
|
||||||
|
from t3 AS a;
|
||||||
|
set done= done-1;
|
||||||
|
until done <= 0 end repeat;
|
||||||
|
end//
|
||||||
|
call p1();
|
||||||
|
x
|
||||||
|
NULL
|
||||||
|
x
|
||||||
|
NULL
|
||||||
|
x
|
||||||
|
NULL
|
||||||
|
call p1();
|
||||||
|
x
|
||||||
|
NULL
|
||||||
|
x
|
||||||
|
NULL
|
||||||
|
x
|
||||||
|
NULL
|
||||||
|
call p1();
|
||||||
|
x
|
||||||
|
NULL
|
||||||
|
x
|
||||||
|
NULL
|
||||||
|
x
|
||||||
|
NULL
|
||||||
|
drop tables t1,t2,t3;
|
||||||
|
@ -183,3 +183,57 @@ group by country;
|
|||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#14342: wrong placement of subquery internals in complex queries
|
||||||
|
#
|
||||||
|
CREATE TABLE `t1` (
|
||||||
|
`t3_id` int NOT NULL,
|
||||||
|
`t1_id` int NOT NULL,
|
||||||
|
PRIMARY KEY (`t1_id`)
|
||||||
|
);
|
||||||
|
CREATE TABLE `t2` (
|
||||||
|
`t2_id` int NOT NULL,
|
||||||
|
`t1_id` int NOT NULL,
|
||||||
|
`b` int NOT NULL,
|
||||||
|
PRIMARY KEY (`t2_id`),
|
||||||
|
UNIQUE KEY `idx_t2_t1_b` (`t1_id`,`b`)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE `t3` (
|
||||||
|
`t3_id` int NOT NULL
|
||||||
|
);
|
||||||
|
INSERT INTO `t3` VALUES (3);
|
||||||
|
select
|
||||||
|
(SELECT rs.t2_id
|
||||||
|
FROM t2 rs
|
||||||
|
WHERE rs.t1_id=
|
||||||
|
(SELECT lt.t1_id
|
||||||
|
FROM t1 lt
|
||||||
|
WHERE lt.t3_id=a.t3_id)
|
||||||
|
ORDER BY b DESC LIMIT 1)
|
||||||
|
from t3 AS a;
|
||||||
|
# repeat above query in SP
|
||||||
|
--disable_warnings
|
||||||
|
DROP PROCEDURE IF EXISTS p1;
|
||||||
|
--enable_warnings
|
||||||
|
delimiter //;
|
||||||
|
create procedure p1()
|
||||||
|
begin
|
||||||
|
declare done int default 3;
|
||||||
|
repeat
|
||||||
|
select
|
||||||
|
(SELECT rs.t2_id
|
||||||
|
FROM t2 rs
|
||||||
|
WHERE rs.t1_id=
|
||||||
|
(SELECT lt.t1_id
|
||||||
|
FROM t1 lt
|
||||||
|
WHERE lt.t3_id=a.t3_id)
|
||||||
|
ORDER BY b DESC LIMIT 1) as x
|
||||||
|
from t3 AS a;
|
||||||
|
set done= done-1;
|
||||||
|
until done <= 0 end repeat;
|
||||||
|
end//
|
||||||
|
delimiter ;//
|
||||||
|
call p1();
|
||||||
|
call p1();
|
||||||
|
call p1();
|
||||||
|
drop tables t1,t2,t3;
|
||||||
|
@ -5759,10 +5759,17 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table,
|
|||||||
MEM_ROOT *old_root= thd->mem_root;
|
MEM_ROOT *old_root= thd->mem_root;
|
||||||
/* The following call may change thd->mem_root */
|
/* The following call may change thd->mem_root */
|
||||||
QUICK_RANGE_SELECT *quick= new QUICK_RANGE_SELECT(thd, table, ref->key, 0);
|
QUICK_RANGE_SELECT *quick= new QUICK_RANGE_SELECT(thd, table, ref->key, 0);
|
||||||
|
/* save mem_root set by QUICK_RANGE_SELECT constructor */
|
||||||
|
MEM_ROOT *alloc= thd->mem_root;
|
||||||
KEY *key_info = &table->key_info[ref->key];
|
KEY *key_info = &table->key_info[ref->key];
|
||||||
KEY_PART *key_part;
|
KEY_PART *key_part;
|
||||||
QUICK_RANGE *range;
|
QUICK_RANGE *range;
|
||||||
uint part;
|
uint part;
|
||||||
|
/*
|
||||||
|
return back default mem_root (thd->mem_root) changed by
|
||||||
|
QUICK_RANGE_SELECT constructor
|
||||||
|
*/
|
||||||
|
thd->mem_root= old_root;
|
||||||
|
|
||||||
if (!quick)
|
if (!quick)
|
||||||
return 0; /* no ranges found */
|
return 0; /* no ranges found */
|
||||||
@ -5774,7 +5781,7 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table,
|
|||||||
quick->records= records;
|
quick->records= records;
|
||||||
|
|
||||||
if (cp_buffer_from_ref(thd,ref) && thd->is_fatal_error ||
|
if (cp_buffer_from_ref(thd,ref) && thd->is_fatal_error ||
|
||||||
!(range= new QUICK_RANGE()))
|
!(range= new(alloc) QUICK_RANGE()))
|
||||||
goto err; // out of memory
|
goto err; // out of memory
|
||||||
|
|
||||||
range->min_key=range->max_key=(char*) ref->key_buff;
|
range->min_key=range->max_key=(char*) ref->key_buff;
|
||||||
@ -5809,20 +5816,20 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table,
|
|||||||
QUICK_RANGE *null_range;
|
QUICK_RANGE *null_range;
|
||||||
|
|
||||||
*ref->null_ref_key= 1; // Set null byte then create a range
|
*ref->null_ref_key= 1; // Set null byte then create a range
|
||||||
if (!(null_range= new QUICK_RANGE((char*)ref->key_buff, ref->key_length,
|
if (!(null_range= new (alloc) QUICK_RANGE((char*)ref->key_buff,
|
||||||
(char*)ref->key_buff, ref->key_length,
|
ref->key_length,
|
||||||
EQ_RANGE)))
|
(char*)ref->key_buff,
|
||||||
|
ref->key_length,
|
||||||
|
EQ_RANGE)))
|
||||||
goto err;
|
goto err;
|
||||||
*ref->null_ref_key= 0; // Clear null byte
|
*ref->null_ref_key= 0; // Clear null byte
|
||||||
if (insert_dynamic(&quick->ranges,(gptr)&null_range))
|
if (insert_dynamic(&quick->ranges,(gptr)&null_range))
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
thd->mem_root= old_root;
|
|
||||||
return quick;
|
return quick;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
thd->mem_root= old_root;
|
|
||||||
delete quick;
|
delete quick;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user