From eda2ebefba43bde1b1881688576e865f9ba9617c Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Wed, 18 Jan 2017 20:40:15 +0100 Subject: MDEV-11784 View is created with invalid definition which causes ERROR 1241 (21000): Operand should contain 1 column(s) set the correct print precedence for IN subqueries --- mysql-test/r/view.result | 15 +++++++++++---- mysql-test/t/view.test | 19 +++++++++++-------- sql/item_subselect.h | 22 ++++++++++------------ 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 39b4410b9eb..7aa1ad3c044 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -1,7 +1,3 @@ -drop table if exists t1,t2,t3,t4,t5,t6,t9,`t1a``b`,v1,v2,v3,v4,v5,v6; -drop view if exists t1,t2,t3,t4,t5,t6,t9,`t1a``b`,v1,v2,v3,v4,v5,v6; -drop database if exists mysqltest; -use test; SET @save_optimizer_switch=@@optimizer_switch; SET optimizer_switch='outer_join_with_cache=off'; create view v1 (c,d) as select a,b from t1; @@ -6325,6 +6321,17 @@ INSERT INTO v (f1, f3) VALUES (1,1), (2,2); ERROR HY000: Can not modify more than one base table through a join view 'test.v' drop view v; drop tables t1,t2,t3; +create table t1 (i int, j int); +insert t1 values (1,1),(2,2); +create view v1 as select (2, 3) not in (select i, j from t1); +select * from v1; +(2, 3) not in (select i, j from t1) +1 +show create view v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select !((2,3) in (select `t1`.`i`,`t1`.`j` from `t1`)) AS `(2, 3) not in (select i, j from t1)` latin1 latin1_swedish_ci +drop view v1; +drop table t1; # # End of 10.2 tests # diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index fbe307be5ba..229df8b893f 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -1,11 +1,3 @@ - ---disable_warnings -drop table if exists t1,t2,t3,t4,t5,t6,t9,`t1a``b`,v1,v2,v3,v4,v5,v6; -drop view if exists t1,t2,t3,t4,t5,t6,t9,`t1a``b`,v1,v2,v3,v4,v5,v6; -drop database if exists mysqltest; ---enable_warnings -use test; - # Save the initial number of concurrent sessions. --source include/count_sessions.inc @@ -6066,6 +6058,17 @@ INSERT INTO v (f1, f3) VALUES (1,1), (2,2); drop view v; drop tables t1,t2,t3; +# +# MDEV-11784 View is created with invalid definition which causes ERROR 1241 (21000): Operand should contain 1 column(s) +# +create table t1 (i int, j int); +insert t1 values (1,1),(2,2); +create view v1 as select (2, 3) not in (select i, j from t1); +select * from v1; +show create view v1; +drop view v1; +drop table t1; + --echo # --echo # End of 10.2 tests --echo # diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 823dbc6c281..805e8958246 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -399,7 +399,7 @@ public: bool val_bool(); bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec(); - virtual void print(String *str, enum_query_type query_type); + void print(String *str, enum_query_type query_type); bool select_transformer(JOIN *join); void top_level_item() { abort_on_null=1; } inline bool is_top_level_item() { return abort_on_null; } @@ -616,7 +616,8 @@ public: void update_null_value () { (void) val_bool(); } bool val_bool(); bool test_limit(st_select_lex_unit *unit); - virtual void print(String *str, enum_query_type query_type); + void print(String *str, enum_query_type query_type); + enum precedence precedence() const { return CMP_PRECEDENCE; } bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec(); void fix_after_pullout(st_select_lex *new_parent, Item **ref); @@ -740,7 +741,7 @@ public: subs_type substype() { return all?ALL_SUBS:ANY_SUBS; } bool select_transformer(JOIN *join); void create_comp_func(bool invert) { func= func_creator(invert); } - virtual void print(String *str, enum_query_type query_type); + void print(String *str, enum_query_type query_type); bool is_maxmin_applicable(JOIN *join); bool transform_into_max_min(JOIN *join); void no_rows_in_result(); @@ -849,7 +850,7 @@ public: uint8 uncacheable(); void exclude(); table_map upper_select_const_tables(); - virtual void print (String *str, enum_query_type query_type); + void print (String *str, enum_query_type query_type); bool change_result(Item_subselect *si, select_result_interceptor *result, bool temp); @@ -883,7 +884,7 @@ public: uint8 uncacheable(); void exclude(); table_map upper_select_const_tables(); - virtual void print (String *str, enum_query_type query_type); + void print (String *str, enum_query_type query_type); bool change_result(Item_subselect *si, select_result_interceptor *result, bool temp= FALSE); @@ -940,7 +941,7 @@ public: uint8 uncacheable() { return UNCACHEABLE_DEPENDENT_INJECTED; } void exclude(); table_map upper_select_const_tables() { return 0; } - virtual void print (String *str, enum_query_type query_type); + void print (String *str, enum_query_type query_type); bool change_result(Item_subselect *si, select_result_interceptor *result, bool temp= FALSE); @@ -998,7 +999,7 @@ public: having(having_arg) {} int exec(); - virtual void print (String *str, enum_query_type query_type); + void print (String *str, enum_query_type query_type); virtual enum_engine_type engine_type() { return INDEXSUBQUERY_ENGINE; } }; @@ -1073,11 +1074,8 @@ public: void cleanup(); int prepare(THD *); int exec(); - virtual void print(String *str, enum_query_type query_type); - uint cols() - { - return materialize_engine->cols(); - } + void print(String *str, enum_query_type query_type); + uint cols() { return materialize_engine->cols(); } uint8 uncacheable() { return materialize_engine->uncacheable(); } table_map upper_select_const_tables() { return 0; } bool no_rows() { return !tmp_table->file->stats.records; } -- cgit v1.2.1