summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2017-01-18 20:40:15 +0100
committerSergei Golubchik <serg@mariadb.org>2017-02-13 18:12:04 +0100
commiteda2ebefba43bde1b1881688576e865f9ba9617c (patch)
treeea9cd5e9ff2c670643c158929f8db7ab7e660818
parentcf003933785cbf88504bcf81001c776dabd64b15 (diff)
downloadmariadb-git-eda2ebefba43bde1b1881688576e865f9ba9617c.tar.gz
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
-rw-r--r--mysql-test/r/view.result15
-rw-r--r--mysql-test/t/view.test19
-rw-r--r--sql/item_subselect.h22
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; }