Commit 8a296e6c authored by unknown's avatar unknown

backport of:

Don't reset maybe_null in update_used_tables(); This breaks ROLLUP
This fixed failing test in group_by.test
parent a716b061
...@@ -1770,10 +1770,10 @@ SELECT t1.pk FROM t2 LEFT JOIN t1 ON t2.pk = t1.a ...@@ -1770,10 +1770,10 @@ SELECT t1.pk FROM t2 LEFT JOIN t1 ON t2.pk = t1.a
WHERE t1.b BETWEEN 5 AND 6 AND t1.pk IS NULL OR t1.pk = 5 WHERE t1.b BETWEEN 5 AND 6 AND t1.pk IS NULL OR t1.pk = 5
ORDER BY t1.pk; ORDER BY t1.pk;
id select_type table type possible_keys key key_len ref rows filtered Extra id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 100.00 1 SIMPLE t1 const PRIMARY,idx PRIMARY 4 const 1 100.00
1 SIMPLE t2 const PRIMARY PRIMARY 4 const 1 100.00 Using index 1 SIMPLE t2 const PRIMARY PRIMARY 4 const 1 100.00 Using index
Warnings: Warnings:
Note 1003 select 5 AS `pk` from `test`.`t2` join `test`.`t1` where (1) order by 5 Note 1003 select 5 AS `pk` from `test`.`t2` join `test`.`t1` where ((((1 between 5 and 6) and isnull(5)) or 1)) order by 5
SELECT t1.pk FROM t2 LEFT JOIN t1 ON t2.pk = t1.a SELECT t1.pk FROM t2 LEFT JOIN t1 ON t2.pk = t1.a
WHERE t1.b BETWEEN 5 AND 6 AND t1.pk IS NULL OR t1.pk = 5 WHERE t1.b BETWEEN 5 AND 6 AND t1.pk IS NULL OR t1.pk = 5
ORDER BY t1.pk; ORDER BY t1.pk;
...@@ -1809,10 +1809,10 @@ SELECT t1.b, t2.c, t2.d FROM t2 LEFT JOIN t1 ON t2.c = t1.a ...@@ -1809,10 +1809,10 @@ SELECT t1.b, t2.c, t2.d FROM t2 LEFT JOIN t1 ON t2.c = t1.a
WHERE t1.pk BETWEEN 5 AND 6 AND t1.b IS NULL OR t1.b = 5 WHERE t1.pk BETWEEN 5 AND 6 AND t1.b IS NULL OR t1.b = 5
ORDER BY t1.b; ORDER BY t1.b;
id select_type table type possible_keys key key_len ref rows filtered Extra id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 ref idx idx 4 const 2 100.00 Using where 1 SIMPLE t1 ref PRIMARY,idx idx 4 const 2 100.00 Using where; Using filesort
1 SIMPLE t2 ref c c 5 test.t1.a 2 100.00 1 SIMPLE t2 ref c c 5 test.t1.a 2 100.00
Warnings: Warnings:
Note 1003 select `test`.`t1`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` join `test`.`t1` where ((`test`.`t2`.`c` = `test`.`t1`.`a`) and (`test`.`t1`.`b` = 5)) order by `test`.`t1`.`b` Note 1003 select `test`.`t1`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` join `test`.`t1` where ((`test`.`t2`.`c` = `test`.`t1`.`a`) and (((`test`.`t1`.`pk` between 5 and 6) and isnull(`test`.`t1`.`b`)) or (`test`.`t1`.`b` = 5))) order by `test`.`t1`.`b`
SELECT t1.b, t2.c, t2.d FROM t2 LEFT JOIN t1 ON t2.c = t1.a SELECT t1.b, t2.c, t2.d FROM t2 LEFT JOIN t1 ON t2.c = t1.a
WHERE t1.pk BETWEEN 5 AND 6 AND t1.b IS NULL OR t1.b = 5 WHERE t1.pk BETWEEN 5 AND 6 AND t1.b IS NULL OR t1.b = 5
ORDER BY t1.b; ORDER BY t1.b;
......
...@@ -1781,10 +1781,10 @@ SELECT t1.pk FROM t2 LEFT JOIN t1 ON t2.pk = t1.a ...@@ -1781,10 +1781,10 @@ SELECT t1.pk FROM t2 LEFT JOIN t1 ON t2.pk = t1.a
WHERE t1.b BETWEEN 5 AND 6 AND t1.pk IS NULL OR t1.pk = 5 WHERE t1.b BETWEEN 5 AND 6 AND t1.pk IS NULL OR t1.pk = 5
ORDER BY t1.pk; ORDER BY t1.pk;
id select_type table type possible_keys key key_len ref rows filtered Extra id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 100.00 1 SIMPLE t1 const PRIMARY,idx PRIMARY 4 const 1 100.00
1 SIMPLE t2 const PRIMARY PRIMARY 4 const 1 100.00 Using index 1 SIMPLE t2 const PRIMARY PRIMARY 4 const 1 100.00 Using index
Warnings: Warnings:
Note 1003 select 5 AS `pk` from `test`.`t2` join `test`.`t1` where (1) order by 5 Note 1003 select 5 AS `pk` from `test`.`t2` join `test`.`t1` where ((((1 between 5 and 6) and isnull(5)) or 1)) order by 5
SELECT t1.pk FROM t2 LEFT JOIN t1 ON t2.pk = t1.a SELECT t1.pk FROM t2 LEFT JOIN t1 ON t2.pk = t1.a
WHERE t1.b BETWEEN 5 AND 6 AND t1.pk IS NULL OR t1.pk = 5 WHERE t1.b BETWEEN 5 AND 6 AND t1.pk IS NULL OR t1.pk = 5
ORDER BY t1.pk; ORDER BY t1.pk;
...@@ -1820,10 +1820,10 @@ SELECT t1.b, t2.c, t2.d FROM t2 LEFT JOIN t1 ON t2.c = t1.a ...@@ -1820,10 +1820,10 @@ SELECT t1.b, t2.c, t2.d FROM t2 LEFT JOIN t1 ON t2.c = t1.a
WHERE t1.pk BETWEEN 5 AND 6 AND t1.b IS NULL OR t1.b = 5 WHERE t1.pk BETWEEN 5 AND 6 AND t1.b IS NULL OR t1.b = 5
ORDER BY t1.b; ORDER BY t1.b;
id select_type table type possible_keys key key_len ref rows filtered Extra id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 ref idx idx 4 const 2 100.00 Using where 1 SIMPLE t1 ref PRIMARY,idx idx 4 const 2 100.00 Using where; Using filesort
1 SIMPLE t2 ref c c 5 test.t1.a 2 100.00 1 SIMPLE t2 ref c c 5 test.t1.a 2 100.00
Warnings: Warnings:
Note 1003 select `test`.`t1`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` join `test`.`t1` where ((`test`.`t2`.`c` = `test`.`t1`.`a`) and (`test`.`t1`.`b` = 5)) order by `test`.`t1`.`b` Note 1003 select `test`.`t1`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` join `test`.`t1` where ((`test`.`t2`.`c` = `test`.`t1`.`a`) and (((`test`.`t1`.`pk` between 5 and 6) and isnull(`test`.`t1`.`b`)) or (`test`.`t1`.`b` = 5))) order by `test`.`t1`.`b`
SELECT t1.b, t2.c, t2.d FROM t2 LEFT JOIN t1 ON t2.c = t1.a SELECT t1.b, t2.c, t2.d FROM t2 LEFT JOIN t1 ON t2.c = t1.a
WHERE t1.pk BETWEEN 5 AND 6 AND t1.b IS NULL OR t1.b = 5 WHERE t1.pk BETWEEN 5 AND 6 AND t1.b IS NULL OR t1.b = 5
ORDER BY t1.b; ORDER BY t1.b;
......
...@@ -9169,7 +9169,7 @@ void Item_ref::update_used_tables() ...@@ -9169,7 +9169,7 @@ void Item_ref::update_used_tables()
{ {
if (!get_depended_from()) if (!get_depended_from())
(*ref)->update_used_tables(); (*ref)->update_used_tables();
maybe_null= (*ref)->maybe_null; maybe_null|= (*ref)->maybe_null;
} }
void Item_direct_view_ref::update_used_tables() void Item_direct_view_ref::update_used_tables()
......
...@@ -1855,7 +1855,7 @@ class Item_field :public Item_ident ...@@ -1855,7 +1855,7 @@ class Item_field :public Item_ident
{ {
update_table_bitmaps(); update_table_bitmaps();
if (field && field->table) if (field && field->table)
maybe_null= field->maybe_null(); maybe_null|= field->maybe_null();
} }
Item *get_tmp_table_item(THD *thd); Item *get_tmp_table_item(THD *thd);
bool collect_item_field_processor(uchar * arg); bool collect_item_field_processor(uchar * arg);
...@@ -2882,7 +2882,7 @@ class Item_cache_wrapper :public Item_result_field ...@@ -2882,7 +2882,7 @@ class Item_cache_wrapper :public Item_result_field
void update_used_tables() void update_used_tables()
{ {
orig_item->update_used_tables(); orig_item->update_used_tables();
maybe_null= orig_item->maybe_null; maybe_null|= orig_item->maybe_null;
} }
bool const_item() const { return orig_item->const_item(); } bool const_item() const { return orig_item->const_item(); }
table_map not_null_tables() const { return orig_item->not_null_tables(); } table_map not_null_tables() const { return orig_item->not_null_tables(); }
......
...@@ -760,7 +760,7 @@ class Item_func_ifnull :public Item_func_coalesce ...@@ -760,7 +760,7 @@ class Item_func_ifnull :public Item_func_coalesce
void update_used_tables() void update_used_tables()
{ {
Item_func_coalesce::update_used_tables(); Item_func_coalesce::update_used_tables();
maybe_null= args[1]->maybe_null; maybe_null|= args[1]->maybe_null;
} }
const char *func_name() const { return "ifnull"; } const char *func_name() const { return "ifnull"; }
Field *tmp_table_field(TABLE *table); Field *tmp_table_field(TABLE *table);
...@@ -787,7 +787,7 @@ class Item_func_if :public Item_func ...@@ -787,7 +787,7 @@ class Item_func_if :public Item_func
void update_used_tables() void update_used_tables()
{ {
Item_func::update_used_tables(); Item_func::update_used_tables();
maybe_null= args[1]->maybe_null || args[2]->maybe_null; maybe_null|= args[1]->maybe_null || args[2]->maybe_null;
} }
uint decimal_precision() const; uint decimal_precision() const;
const char *func_name() const { return "if"; } const char *func_name() const { return "if"; }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment