Commit 203f2178 authored by Alexey Kopytov's avatar Alexey Kopytov

Automerge.

parents 0f40402f 975364ad
...@@ -336,4 +336,11 @@ a b ...@@ -336,4 +336,11 @@ a b
NULL NULL NULL NULL
NULL 1 NULL 1
drop table t1; drop table t1;
#
# bug#39918 - memory (heap) engine crashing while executing self join with delete
#
CREATE TABLE t1(a INT, KEY USING BTREE (a)) ENGINE=MEMORY;
INSERT INTO t1 VALUES(1),(1);
DELETE a1 FROM t1 AS a1, t1 AS a2 WHERE a1.a=a2.a;
DROP TABLE t1;
End of 5.0 tests End of 5.0 tests
...@@ -253,5 +253,13 @@ insert into t1 values (1, 1), (3, 3), (2, 2), (NULL, 1), (NULL, NULL), (0, 0); ...@@ -253,5 +253,13 @@ insert into t1 values (1, 1), (3, 3), (2, 2), (NULL, 1), (NULL, NULL), (0, 0);
select * from t1 where a is null; select * from t1 where a is null;
drop table t1; drop table t1;
-- echo #
-- echo # bug#39918 - memory (heap) engine crashing while executing self join with delete
-- echo #
CREATE TABLE t1(a INT, KEY USING BTREE (a)) ENGINE=MEMORY;
INSERT INTO t1 VALUES(1),(1);
DELETE a1 FROM t1 AS a1, t1 AS a2 WHERE a1.a=a2.a;
DROP TABLE t1;
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -503,6 +503,11 @@ int mysql_multi_delete_prepare(THD *thd) ...@@ -503,6 +503,11 @@ int mysql_multi_delete_prepare(THD *thd)
} }
} }
} }
/*
Reset the exclude flag to false so it doesn't interfare
with further calls to unique_table
*/
lex->select_lex.exclude_from_table_unique_test= FALSE;
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }
...@@ -538,11 +543,24 @@ multi_delete::initialize_tables(JOIN *join) ...@@ -538,11 +543,24 @@ multi_delete::initialize_tables(JOIN *join)
DBUG_RETURN(1); DBUG_RETURN(1);
table_map tables_to_delete_from=0; table_map tables_to_delete_from=0;
delete_while_scanning= 1;
for (walk= delete_tables; walk; walk= walk->next_local) for (walk= delete_tables; walk; walk= walk->next_local)
{
tables_to_delete_from|= walk->table->map; tables_to_delete_from|= walk->table->map;
if (delete_while_scanning &&
unique_table(thd, walk, join->tables_list, false))
{
/*
If the table we are going to delete from appears
in join, we need to defer delete. So the delete
doesn't interfers with the scaning of results.
*/
delete_while_scanning= 0;
}
}
walk= delete_tables; walk= delete_tables;
delete_while_scanning= 1;
for (JOIN_TAB *tab=join->join_tab, *end=join->join_tab+join->tables; for (JOIN_TAB *tab=join->join_tab, *end=join->join_tab+join->tables;
tab < end; tab < end;
tab++) tab++)
......
...@@ -3971,6 +3971,10 @@ static void test_fetch_date() ...@@ -3971,6 +3971,10 @@ static void test_fetch_date()
myheader("test_fetch_date"); myheader("test_fetch_date");
/* Will not work if sql_mode is NO_ZERO_DATE (implicit if TRADITIONAL) /*/
rc= mysql_query(mysql, "SET SQL_MODE=''");
myquery(rc);
rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_bind_result"); rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_bind_result");
myquery(rc); myquery(rc);
...@@ -4685,6 +4689,9 @@ static void test_stmt_close() ...@@ -4685,6 +4689,9 @@ static void test_stmt_close()
/* set AUTOCOMMIT to ON*/ /* set AUTOCOMMIT to ON*/
mysql_autocommit(lmysql, TRUE); mysql_autocommit(lmysql, TRUE);
rc= mysql_query(lmysql, "SET SQL_MODE = ''");
myquery(rc);
rc= mysql_query(lmysql, "DROP TABLE IF EXISTS test_stmt_close"); rc= mysql_query(lmysql, "DROP TABLE IF EXISTS test_stmt_close");
myquery(rc); myquery(rc);
...@@ -11855,6 +11862,9 @@ static void test_bug6058() ...@@ -11855,6 +11862,9 @@ static void test_bug6058()
myheader("test_bug6058"); myheader("test_bug6058");
rc= mysql_query(mysql, "SET SQL_MODE=''");
myquery(rc);
stmt_text= "SELECT CAST('0000-00-00' AS DATE)"; stmt_text= "SELECT CAST('0000-00-00' AS DATE)";
rc= mysql_real_query(mysql, stmt_text, (uint) strlen(stmt_text)); rc= mysql_real_query(mysql, stmt_text, (uint) strlen(stmt_text));
...@@ -13026,6 +13036,9 @@ static void test_bug8378() ...@@ -13026,6 +13036,9 @@ static void test_bug8378()
if (!opt_silent) if (!opt_silent)
fprintf(stdout, " OK"); fprintf(stdout, " OK");
rc= mysql_query(lmysql, "SET SQL_MODE=''");
myquery(rc);
len= mysql_real_escape_string(lmysql, out, TEST_BUG8378_IN, 4); len= mysql_real_escape_string(lmysql, out, TEST_BUG8378_IN, 4);
/* No escaping should have actually happened. */ /* No escaping should have actually happened. */
...@@ -16056,6 +16069,11 @@ static void test_bug31669() ...@@ -16056,6 +16069,11 @@ static void test_bug31669()
rc= mysql_query(mysql, query); rc= mysql_query(mysql, query);
myquery(rc); myquery(rc);
strxmov(query, "GRANT ALL PRIVILEGES ON *.* TO '", user, "'@'localhost' IDENTIFIED BY "
"'", buff, "' WITH GRANT OPTION", NullS);
rc= mysql_query(mysql, query);
myquery(rc);
rc= mysql_query(mysql, "FLUSH PRIVILEGES"); rc= mysql_query(mysql, "FLUSH PRIVILEGES");
myquery(rc); myquery(rc);
...@@ -16093,7 +16111,7 @@ static void test_bug31669() ...@@ -16093,7 +16111,7 @@ static void test_bug31669()
strxmov(query, "DELETE FROM mysql.user WHERE User='", user, "'", NullS); strxmov(query, "DELETE FROM mysql.user WHERE User='", user, "'", NullS);
rc= mysql_query(mysql, query); rc= mysql_query(mysql, query);
myquery(rc); myquery(rc);
DIE_UNLESS(mysql_affected_rows(mysql) == 1); DIE_UNLESS(mysql_affected_rows(mysql) == 2);
#endif #endif
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment