mirror of
https://github.com/MariaDB/server.git
synced 2025-02-16 02:15:33 +01:00
MDEV-4056 fix.
The problem was that maybe_null of Item_row and its componetes was unsynced after update_used_tables() (and so pushed_cond_guards was not initialized but then requested). Fix updates Item_row::maybe_null on update_used_tables().
This commit is contained in:
parent
d51f96b167
commit
2255132f20
3 changed files with 49 additions and 0 deletions
|
@ -2305,5 +2305,26 @@ SELECT a3 FROM t3 WHERE b2 = b1 AND b2 <= b1 ORDER BY b3
|
||||||
);
|
);
|
||||||
a1 b1
|
a1 b1
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
#
|
||||||
|
# MDEV-4056:Server crashes in Item_func_trig_cond::val_int
|
||||||
|
# with FROM and NOT IN subqueries, LEFT JOIN, derived_merge+in_to_exists
|
||||||
|
#
|
||||||
|
set @optimizer_switch_MDEV4056 = @@optimizer_switch;
|
||||||
|
SET optimizer_switch = 'derived_merge=on,in_to_exists=on';
|
||||||
|
CREATE TABLE t1 (a VARCHAR(1)) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES ('x'),('d');
|
||||||
|
CREATE TABLE t2 (pk INT PRIMARY KEY, b INT, c VARCHAR(1)) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t2 VALUES (1,2,'v'),(2,150,'v');
|
||||||
|
SELECT * FROM t1 LEFT JOIN (
|
||||||
|
SELECT * FROM t2 WHERE ( pk, pk ) NOT IN (
|
||||||
|
SELECT MIN(b), SUM(pk) FROM t1
|
||||||
|
)
|
||||||
|
) AS alias1 ON (a = c)
|
||||||
|
WHERE b IS NULL OR a < 'u';
|
||||||
|
a pk b c
|
||||||
|
x NULL NULL NULL
|
||||||
|
d NULL NULL NULL
|
||||||
|
drop table t1,t2;
|
||||||
|
set @@optimizer_switch = @optimizer_switch_MDEV4056;
|
||||||
SET optimizer_switch= @@global.optimizer_switch;
|
SET optimizer_switch= @@global.optimizer_switch;
|
||||||
set @@tmp_table_size= @@global.tmp_table_size;
|
set @@tmp_table_size= @@global.tmp_table_size;
|
||||||
|
|
|
@ -1886,5 +1886,31 @@ SELECT * FROM t1 WHERE a1 IN (
|
||||||
|
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-4056:Server crashes in Item_func_trig_cond::val_int
|
||||||
|
--echo # with FROM and NOT IN subqueries, LEFT JOIN, derived_merge+in_to_exists
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
set @optimizer_switch_MDEV4056 = @@optimizer_switch;
|
||||||
|
SET optimizer_switch = 'derived_merge=on,in_to_exists=on';
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a VARCHAR(1)) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES ('x'),('d');
|
||||||
|
|
||||||
|
CREATE TABLE t2 (pk INT PRIMARY KEY, b INT, c VARCHAR(1)) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t2 VALUES (1,2,'v'),(2,150,'v');
|
||||||
|
|
||||||
|
SELECT * FROM t1 LEFT JOIN (
|
||||||
|
SELECT * FROM t2 WHERE ( pk, pk ) NOT IN (
|
||||||
|
SELECT MIN(b), SUM(pk) FROM t1
|
||||||
|
)
|
||||||
|
) AS alias1 ON (a = c)
|
||||||
|
WHERE b IS NULL OR a < 'u';
|
||||||
|
|
||||||
|
drop table t1,t2;
|
||||||
|
set @@optimizer_switch = @optimizer_switch_MDEV4056;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SET optimizer_switch= @@global.optimizer_switch;
|
SET optimizer_switch= @@global.optimizer_switch;
|
||||||
set @@tmp_table_size= @@global.tmp_table_size;
|
set @@tmp_table_size= @@global.tmp_table_size;
|
||||||
|
|
|
@ -139,11 +139,13 @@ void Item_row::update_used_tables()
|
||||||
{
|
{
|
||||||
used_tables_cache= 0;
|
used_tables_cache= 0;
|
||||||
const_item_cache= 1;
|
const_item_cache= 1;
|
||||||
|
maybe_null= 0;
|
||||||
for (uint i= 0; i < arg_count; i++)
|
for (uint i= 0; i < arg_count; i++)
|
||||||
{
|
{
|
||||||
items[i]->update_used_tables();
|
items[i]->update_used_tables();
|
||||||
used_tables_cache|= items[i]->used_tables();
|
used_tables_cache|= items[i]->used_tables();
|
||||||
const_item_cache&= items[i]->const_item();
|
const_item_cache&= items[i]->const_item();
|
||||||
|
maybe_null|= items[i]->maybe_null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue