mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 13:32:33 +01:00
Merge olga.mysql.com:/home/igor/mysql-5.0-opt
into olga.mysql.com:/home/igor/dev-opt/mysql-5.0-opt-bug24345
This commit is contained in:
commit
ae6bee30fc
3 changed files with 105 additions and 1 deletions
|
@ -1562,3 +1562,46 @@ id ngroupbynsa
|
||||||
2 1
|
2 1
|
||||||
2 1
|
2 1
|
||||||
DROP TABLE t1,t2,t3,t4,t5;
|
DROP TABLE t1,t2,t3,t4,t5;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id int NOT NULL PRIMARY KEY,
|
||||||
|
ct int DEFAULT NULL,
|
||||||
|
pc int DEFAULT NULL,
|
||||||
|
INDEX idx_ct (ct),
|
||||||
|
INDEX idx_pc (pc)
|
||||||
|
);
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(1,NULL,NULL),(2,NULL,NULL),(3,NULL,NULL),(4,NULL,NULL),(5,NULL,NULL);
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
id int NOT NULL PRIMARY KEY,
|
||||||
|
sr int NOT NULL,
|
||||||
|
nm varchar(255) NOT NULL,
|
||||||
|
INDEX idx_sr (sr)
|
||||||
|
);
|
||||||
|
INSERT INTO t2 VALUES
|
||||||
|
(2441905,4308,'LesAbymes'),(2441906,4308,'Anse-Bertrand');
|
||||||
|
CREATE TABLE t3 (
|
||||||
|
id int NOT NULL PRIMARY KEY,
|
||||||
|
ct int NOT NULL,
|
||||||
|
ln int NOT NULL,
|
||||||
|
INDEX idx_ct (ct),
|
||||||
|
INDEX idx_ln (ln)
|
||||||
|
);
|
||||||
|
CREATE TABLE t4 (
|
||||||
|
id int NOT NULL PRIMARY KEY,
|
||||||
|
nm varchar(255) NOT NULL
|
||||||
|
);
|
||||||
|
INSERT INTO t4 VALUES (4308,'Guadeloupe'),(4309,'Martinique');
|
||||||
|
SELECT t1.*
|
||||||
|
FROM t1 LEFT JOIN
|
||||||
|
(t2 LEFT JOIN t3 ON t3.ct=t2.id AND t3.ln='5') ON t1.ct=t2.id
|
||||||
|
WHERE t1.id='5';
|
||||||
|
id ct pc
|
||||||
|
5 NULL NULL
|
||||||
|
SELECT t1.*, t4.nm
|
||||||
|
FROM t1 LEFT JOIN
|
||||||
|
(t2 LEFT JOIN t3 ON t3.ct=t2.id AND t3.ln='5') ON t1.ct=t2.id
|
||||||
|
LEFT JOIN t4 ON t2.sr=t4.id
|
||||||
|
WHERE t1.id='5';
|
||||||
|
id ct pc nm
|
||||||
|
5 NULL NULL NULL
|
||||||
|
DROP TABLE t1,t2,t3,t4;
|
||||||
|
|
|
@ -994,3 +994,54 @@ SELECT t1.id1 AS id, t5.id1 AS ngroupbynsa
|
||||||
|
|
||||||
DROP TABLE t1,t2,t3,t4,t5;
|
DROP TABLE t1,t2,t3,t4,t5;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test for bug #24345: crash with nested left outer join when outer table is substituted
|
||||||
|
# for a row that happens to have a null value for the join attribute.
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id int NOT NULL PRIMARY KEY,
|
||||||
|
ct int DEFAULT NULL,
|
||||||
|
pc int DEFAULT NULL,
|
||||||
|
INDEX idx_ct (ct),
|
||||||
|
INDEX idx_pc (pc)
|
||||||
|
);
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(1,NULL,NULL),(2,NULL,NULL),(3,NULL,NULL),(4,NULL,NULL),(5,NULL,NULL);
|
||||||
|
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
id int NOT NULL PRIMARY KEY,
|
||||||
|
sr int NOT NULL,
|
||||||
|
nm varchar(255) NOT NULL,
|
||||||
|
INDEX idx_sr (sr)
|
||||||
|
);
|
||||||
|
INSERT INTO t2 VALUES
|
||||||
|
(2441905,4308,'LesAbymes'),(2441906,4308,'Anse-Bertrand');
|
||||||
|
|
||||||
|
CREATE TABLE t3 (
|
||||||
|
id int NOT NULL PRIMARY KEY,
|
||||||
|
ct int NOT NULL,
|
||||||
|
ln int NOT NULL,
|
||||||
|
INDEX idx_ct (ct),
|
||||||
|
INDEX idx_ln (ln)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE t4 (
|
||||||
|
id int NOT NULL PRIMARY KEY,
|
||||||
|
nm varchar(255) NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO t4 VALUES (4308,'Guadeloupe'),(4309,'Martinique');
|
||||||
|
|
||||||
|
SELECT t1.*
|
||||||
|
FROM t1 LEFT JOIN
|
||||||
|
(t2 LEFT JOIN t3 ON t3.ct=t2.id AND t3.ln='5') ON t1.ct=t2.id
|
||||||
|
WHERE t1.id='5';
|
||||||
|
|
||||||
|
SELECT t1.*, t4.nm
|
||||||
|
FROM t1 LEFT JOIN
|
||||||
|
(t2 LEFT JOIN t3 ON t3.ct=t2.id AND t3.ln='5') ON t1.ct=t2.id
|
||||||
|
LEFT JOIN t4 ON t2.sr=t4.id
|
||||||
|
WHERE t1.id='5';
|
||||||
|
|
||||||
|
DROP TABLE t1,t2,t3,t4;
|
||||||
|
|
|
@ -2305,8 +2305,18 @@ make_join_statistics(JOIN *join, TABLE_LIST *tables, COND *conds,
|
||||||
substitution of a const table the key value happens to be null
|
substitution of a const table the key value happens to be null
|
||||||
then we can state that there are no matches for this equi-join.
|
then we can state that there are no matches for this equi-join.
|
||||||
*/
|
*/
|
||||||
if ((keyuse= s->keyuse) && *s->on_expr_ref)
|
if ((keyuse= s->keyuse) && *s->on_expr_ref && !s->embedding_map)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
When performing an outer join operation if there are no matching rows
|
||||||
|
for the single row of the outer table all the inner tables are to be
|
||||||
|
null complemented and thus considered as constant tables.
|
||||||
|
Here we apply this consideration to the case of outer join operations
|
||||||
|
with a single inner table only because the case with nested tables
|
||||||
|
would require a more thorough analysis.
|
||||||
|
TODO. Apply single row substitution to null complemented inner tables
|
||||||
|
for nested outer join operations.
|
||||||
|
*/
|
||||||
while (keyuse->table == table)
|
while (keyuse->table == table)
|
||||||
{
|
{
|
||||||
if (!(keyuse->val->used_tables() & ~join->const_table_map) &&
|
if (!(keyuse->val->used_tables() & ~join->const_table_map) &&
|
||||||
|
|
Loading…
Reference in a new issue