diff options
-rw-r--r-- | mysql-test/main/precedence_bugs.result | 18 | ||||
-rw-r--r-- | mysql-test/main/precedence_bugs.test | 16 | ||||
-rw-r--r-- | sql/item_cmpfunc.h | 2 | ||||
-rw-r--r-- | sql/item_subselect.h | 1 |
4 files changed, 37 insertions, 0 deletions
diff --git a/mysql-test/main/precedence_bugs.result b/mysql-test/main/precedence_bugs.result index 4b13e820d7f..723ab823b48 100644 --- a/mysql-test/main/precedence_bugs.result +++ b/mysql-test/main/precedence_bugs.result @@ -58,3 +58,21 @@ Create View CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY D character_set_client latin1 collation_connection latin1_swedish_ci drop view v1; +# +# MDEV-30082 View definition losing brackets changes semantics of the query and causes wrong result +# +create table t1 (a varchar(1), b bool) engine=myisam; +insert into t1 values ('u',1),('s',1); +select * from t1 where t1.b in (t1.a <= all (select 'a')); +a b +create view v as select * from t1 where t1.b in (t1.a <= all (select 'a')); +select * from v; +a b +show create view v; +View Create View character_set_client collation_connection +v CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `t1`.`a` AS `a`,`t1`.`b` AS `b` from `t1` where `t1`.`b` = (`t1`.`a` <= all (select 'a')) latin1 latin1_swedish_ci +drop view v; +drop table t1; +# +# End of 10.3 results +# diff --git a/mysql-test/main/precedence_bugs.test b/mysql-test/main/precedence_bugs.test index 6e8e624c840..ae35ca91527 100644 --- a/mysql-test/main/precedence_bugs.test +++ b/mysql-test/main/precedence_bugs.test @@ -39,3 +39,19 @@ drop table t1; create view v1 as select 1 like (now() between '2000-01-01' and '2012-12-12' ); query_vertical show create view v1; drop view v1; + +--echo # +--echo # MDEV-30082 View definition losing brackets changes semantics of the query and causes wrong result +--echo # +create table t1 (a varchar(1), b bool) engine=myisam; +insert into t1 values ('u',1),('s',1); +select * from t1 where t1.b in (t1.a <= all (select 'a')); +create view v as select * from t1 where t1.b in (t1.a <= all (select 'a')); +select * from v; +show create view v; +drop view v; +drop table t1; + +--echo # +--echo # End of 10.3 results +--echo # diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index f3d3be44b62..671fa52635d 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -668,6 +668,8 @@ public: longlong val_int(); enum Functype functype() const { return NOT_ALL_FUNC; } const char *func_name() const { return "<not>"; } + enum precedence precedence() const + { return show ? Item_func::precedence() : args[0]->precedence(); } bool fix_fields(THD *thd, Item **ref) {return Item_func::fix_fields(thd, ref);} virtual void print(String *str, enum_query_type query_type); diff --git a/sql/item_subselect.h b/sql/item_subselect.h index b95a02d28b2..32bedb522ac 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -783,6 +783,7 @@ public: bool select_transformer(JOIN *join); void create_comp_func(bool invert) { func= func_creator(invert); } void print(String *str, enum_query_type query_type); + enum precedence precedence() const { return CMP_PRECEDENCE; } bool is_maxmin_applicable(JOIN *join); bool transform_into_max_min(JOIN *join); void no_rows_in_result(); |