summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/main/precedence_bugs.result18
-rw-r--r--mysql-test/main/precedence_bugs.test16
-rw-r--r--sql/item_cmpfunc.h2
-rw-r--r--sql/item_subselect.h1
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();