Loading mysql-test/r/subselect.result +30 −0 Original line number Diff line number Diff line Loading @@ -4448,4 +4448,34 @@ SELECT t1.a, (SELECT 1 FROM t2 WHERE t2.b=t3.c AND t2.c=t1.a ORDER BY t2.d LIMIT a incorrect 1 1 DROP TABLE t1,t2,t3; CREATE TABLE t1 (id int); CREATE TABLE t2 (id int, c int); INSERT INTO t1 (id) VALUES (1); INSERT INTO t2 (id) VALUES (1); INSERT INTO t1 (id) VALUES (1); INSERT INTO t2 (id) VALUES (1); CREATE VIEW v1 AS SELECT t2.c AS c FROM t1, t2 WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION; UPDATE v1 SET c=1; CREATE VIEW v2 (a,b) AS SELECT t2.id, t2.c AS c FROM t1, t2 WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION; INSERT INTO v2(a,b) VALUES (2,2); ERROR HY000: CHECK OPTION failed 'test.v2' INSERT INTO v2(a,b) VALUES (1,2); SELECT * FROM v1; c 1 1 1 1 2 2 CREATE VIEW v3 AS SELECT t2.c AS c FROM t2 WHERE 1 IN (SELECT id FROM t1) WITH CHECK OPTION; DELETE FROM v3; DROP VIEW v1,v2,v3; DROP TABLE t1,t2; End of 5.1 tests. mysql-test/t/subselect.test +36 −0 Original line number Diff line number Diff line Loading @@ -3355,4 +3355,40 @@ SELECT t1.a, (SELECT 1 FROM t2 WHERE t2.b=t3.c AND t2.c=t1.a ORDER BY t2.d LIMIT SELECT t1.a, (SELECT 1 FROM t2 WHERE t2.b=t3.c AND t2.c=t1.a ORDER BY t2.d LIMIT 1) AS incorrect FROM t1, t3 WHERE t3.b=t1.a; DROP TABLE t1,t2,t3; # # Bug#37460 Assertion failed: # !table->file || table->file->inited == handler::NONE # CREATE TABLE t1 (id int); CREATE TABLE t2 (id int, c int); INSERT INTO t1 (id) VALUES (1); INSERT INTO t2 (id) VALUES (1); INSERT INTO t1 (id) VALUES (1); INSERT INTO t2 (id) VALUES (1); CREATE VIEW v1 AS SELECT t2.c AS c FROM t1, t2 WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION; UPDATE v1 SET c=1; CREATE VIEW v2 (a,b) AS SELECT t2.id, t2.c AS c FROM t1, t2 WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION; --error 1369 INSERT INTO v2(a,b) VALUES (2,2); INSERT INTO v2(a,b) VALUES (1,2); SELECT * FROM v1; CREATE VIEW v3 AS SELECT t2.c AS c FROM t2 WHERE 1 IN (SELECT id FROM t1) WITH CHECK OPTION; DELETE FROM v3; DROP VIEW v1,v2,v3; DROP TABLE t1,t2; --echo End of 5.1 tests. sql/mysql_priv.h +1 −0 Original line number Diff line number Diff line Loading @@ -548,6 +548,7 @@ class Default_object_creation_ctx : public Object_creation_ctx #define UNCACHEABLE_PREPARE 16 /* For uncorrelated SELECT in an UNION with some correlated SELECTs */ #define UNCACHEABLE_UNITED 32 #define UNCACHEABLE_CHECKOPTION 64 /* Used to check GROUP BY list in the MODE_ONLY_FULL_GROUP_BY mode */ #define UNDEF_POS (-1) Loading sql/sql_update.cc +26 −0 Original line number Diff line number Diff line Loading @@ -1470,6 +1470,32 @@ multi_update::initialize_tables(JOIN *join) } table->prepare_for_position(); /* enable uncacheable flag if we update a view with check option and check option has a subselect, otherwise, the check option can be evaluated after the subselect was freed as independent (See full_local in JOIN::join_free()). */ if (table_ref->check_option && !join->select_lex->uncacheable) { SELECT_LEX_UNIT *tmp_unit; SELECT_LEX *sl; for (tmp_unit= join->select_lex->first_inner_unit(); tmp_unit; tmp_unit= tmp_unit->next_unit()) { for (sl= tmp_unit->first_select(); sl; sl= sl->next_select()) { if (sl->master_unit()->item) { join->select_lex->uncacheable|= UNCACHEABLE_CHECKOPTION; goto loop_end; } } } } loop_end: if (table == first_table_for_update && table_ref->check_option) { table_map unupdated_tables= table_ref->check_option->used_tables() & Loading Loading
mysql-test/r/subselect.result +30 −0 Original line number Diff line number Diff line Loading @@ -4448,4 +4448,34 @@ SELECT t1.a, (SELECT 1 FROM t2 WHERE t2.b=t3.c AND t2.c=t1.a ORDER BY t2.d LIMIT a incorrect 1 1 DROP TABLE t1,t2,t3; CREATE TABLE t1 (id int); CREATE TABLE t2 (id int, c int); INSERT INTO t1 (id) VALUES (1); INSERT INTO t2 (id) VALUES (1); INSERT INTO t1 (id) VALUES (1); INSERT INTO t2 (id) VALUES (1); CREATE VIEW v1 AS SELECT t2.c AS c FROM t1, t2 WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION; UPDATE v1 SET c=1; CREATE VIEW v2 (a,b) AS SELECT t2.id, t2.c AS c FROM t1, t2 WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION; INSERT INTO v2(a,b) VALUES (2,2); ERROR HY000: CHECK OPTION failed 'test.v2' INSERT INTO v2(a,b) VALUES (1,2); SELECT * FROM v1; c 1 1 1 1 2 2 CREATE VIEW v3 AS SELECT t2.c AS c FROM t2 WHERE 1 IN (SELECT id FROM t1) WITH CHECK OPTION; DELETE FROM v3; DROP VIEW v1,v2,v3; DROP TABLE t1,t2; End of 5.1 tests.
mysql-test/t/subselect.test +36 −0 Original line number Diff line number Diff line Loading @@ -3355,4 +3355,40 @@ SELECT t1.a, (SELECT 1 FROM t2 WHERE t2.b=t3.c AND t2.c=t1.a ORDER BY t2.d LIMIT SELECT t1.a, (SELECT 1 FROM t2 WHERE t2.b=t3.c AND t2.c=t1.a ORDER BY t2.d LIMIT 1) AS incorrect FROM t1, t3 WHERE t3.b=t1.a; DROP TABLE t1,t2,t3; # # Bug#37460 Assertion failed: # !table->file || table->file->inited == handler::NONE # CREATE TABLE t1 (id int); CREATE TABLE t2 (id int, c int); INSERT INTO t1 (id) VALUES (1); INSERT INTO t2 (id) VALUES (1); INSERT INTO t1 (id) VALUES (1); INSERT INTO t2 (id) VALUES (1); CREATE VIEW v1 AS SELECT t2.c AS c FROM t1, t2 WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION; UPDATE v1 SET c=1; CREATE VIEW v2 (a,b) AS SELECT t2.id, t2.c AS c FROM t1, t2 WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION; --error 1369 INSERT INTO v2(a,b) VALUES (2,2); INSERT INTO v2(a,b) VALUES (1,2); SELECT * FROM v1; CREATE VIEW v3 AS SELECT t2.c AS c FROM t2 WHERE 1 IN (SELECT id FROM t1) WITH CHECK OPTION; DELETE FROM v3; DROP VIEW v1,v2,v3; DROP TABLE t1,t2; --echo End of 5.1 tests.
sql/mysql_priv.h +1 −0 Original line number Diff line number Diff line Loading @@ -548,6 +548,7 @@ class Default_object_creation_ctx : public Object_creation_ctx #define UNCACHEABLE_PREPARE 16 /* For uncorrelated SELECT in an UNION with some correlated SELECTs */ #define UNCACHEABLE_UNITED 32 #define UNCACHEABLE_CHECKOPTION 64 /* Used to check GROUP BY list in the MODE_ONLY_FULL_GROUP_BY mode */ #define UNDEF_POS (-1) Loading
sql/sql_update.cc +26 −0 Original line number Diff line number Diff line Loading @@ -1470,6 +1470,32 @@ multi_update::initialize_tables(JOIN *join) } table->prepare_for_position(); /* enable uncacheable flag if we update a view with check option and check option has a subselect, otherwise, the check option can be evaluated after the subselect was freed as independent (See full_local in JOIN::join_free()). */ if (table_ref->check_option && !join->select_lex->uncacheable) { SELECT_LEX_UNIT *tmp_unit; SELECT_LEX *sl; for (tmp_unit= join->select_lex->first_inner_unit(); tmp_unit; tmp_unit= tmp_unit->next_unit()) { for (sl= tmp_unit->first_select(); sl; sl= sl->next_select()) { if (sl->master_unit()->item) { join->select_lex->uncacheable|= UNCACHEABLE_CHECKOPTION; goto loop_end; } } } } loop_end: if (table == first_table_for_update && table_ref->check_option) { table_map unupdated_tables= table_ref->check_option->used_tables() & Loading