List:Commits« Previous MessageNext Message »
From:Sergey Glukhov Date:July 3 2009 10:45am
Subject:bzr push into mysql-5.1-bugteam branch (Sergey.Glukhov:2993 to 2995)
View as plain text  
 2995 Sergey Glukhov	2009-07-03 [merge]
      5.0-bugteam->5.1-bugteam merge
     @ mysql-test/r/view.result
        5.0-bugteam->5.1-bugteam merge
     @ mysql-test/t/view.test
        5.0-bugteam->5.1-bugteam merge
     @ sql/sql_insert.cc
        5.0-bugteam->5.1-bugteam merge

    modified:
      mysql-test/r/view.result
      mysql-test/t/view.test
      sql/sql_insert.cc
 2994 Sergey Glukhov	2009-07-03
      Bug#42364 SHOW ERRORS returns empty resultset after dropping non existent table
      enabled message storing into error message list
      for 'drop table' command
     @ mysql-test/r/warnings.result
        test result
     @ mysql-test/t/warnings.test
        test case
     @ sql/sql_table.cc
        We should skip error sending then we should return
        warnings to client as some functions may send its
        own errors, so we should set no_warnings_for_error= 0
        only in case of warning.
        The fix is to enable message storing into error message
        list for 'drop table' command(only for error case).
     @ tests/mysql_client_test.c
        test fix

    modified:
      mysql-test/r/warnings.result
      mysql-test/t/warnings.test
      sql/sql_table.cc
      tests/mysql_client_test.c
 2993 Bernt M. Johnsen	2009-07-03 [merge]
      automerge

    modified:
      mysql-test/r/partition.result
      mysql-test/suite/rpl/t/rpl_sp.test
      mysql-test/t/partition.test
      sql/item.cc
      sql/sql_partition.cc
=== modified file 'mysql-test/r/view.result'
--- a/mysql-test/r/view.result	2009-05-19 04:25:36 +0000
+++ b/mysql-test/r/view.result	2009-07-03 08:39:22 +0000
@@ -3718,6 +3718,117 @@ DROP TABLE t1;
 
 # -- End of test case for Bug#40825
 
+# 
+# Bug #45806 crash when replacing into a view with a join!
+# 
+CREATE TABLE t1(a INT UNIQUE);
+CREATE VIEW v1 AS SELECT t1.a FROM t1, t1 AS a;
+INSERT INTO t1 VALUES (1), (2);
+REPLACE INTO v1(a) SELECT 1 FROM t1,t1 AS c;
+SELECT * FROM v1;
+a
+1
+2
+1
+2
+REPLACE INTO v1(a) SELECT 3 FROM t1,t1 AS c;
+SELECT * FROM v1;
+a
+1
+2
+3
+1
+2
+3
+1
+2
+3
+DELETE FROM t1 WHERE a=3;
+INSERT INTO v1(a) SELECT 1 FROM t1,t1 AS c
+ON DUPLICATE KEY UPDATE `v1`.`a`= 1;
+SELECT * FROM v1;
+a
+1
+2
+1
+2
+CREATE VIEW v2 AS SELECT t1.a FROM t1, v1 AS a;
+REPLACE INTO v2(a) SELECT 1 FROM t1,t1 AS c;
+SELECT * FROM v2;
+a
+1
+2
+1
+2
+1
+2
+1
+2
+REPLACE INTO v2(a) SELECT 3 FROM t1,t1 AS c;
+SELECT * FROM v2;
+a
+1
+2
+3
+1
+2
+3
+1
+2
+3
+1
+2
+3
+1
+2
+3
+1
+2
+3
+1
+2
+3
+1
+2
+3
+1
+2
+3
+INSERT INTO v2(a) SELECT 1 FROM t1,t1 AS c
+ON DUPLICATE KEY UPDATE `v2`.`a`= 1;
+SELECT * FROM v2;
+a
+1
+2
+3
+1
+2
+3
+1
+2
+3
+1
+2
+3
+1
+2
+3
+1
+2
+3
+1
+2
+3
+1
+2
+3
+1
+2
+3
+DROP VIEW v1;
+DROP VIEW v2;
+DROP TABLE t1;
+# -- End of test case for Bug#45806
 # -----------------------------------------------------------------
 # -- End of 5.0 tests.
 # -----------------------------------------------------------------

=== modified file 'mysql-test/r/warnings.result'
--- a/mysql-test/r/warnings.result	2009-02-16 11:38:15 +0000
+++ b/mysql-test/r/warnings.result	2009-07-03 08:22:06 +0000
@@ -313,4 +313,9 @@ ERROR 22001: Data too long for column 'c
 insert into t2 values(@q);
 ERROR 22001: Data too long for column 'c_tinyblob' at row 1
 drop table t1, t2;
+DROP TABLE t1;
+ERROR 42S02: Unknown table 't1'
+SHOW ERRORS;
+Level	Code	Message
+Error	1051	Unknown table 't1'
 End of 5.0 tests

=== modified file 'mysql-test/t/view.test'
--- a/mysql-test/t/view.test	2009-05-19 04:25:36 +0000
+++ b/mysql-test/t/view.test	2009-07-03 08:39:22 +0000
@@ -3703,6 +3703,38 @@ DROP TABLE t1;
 --echo # -- End of test case for Bug#40825
 --echo
 
+--echo # 
+--echo # Bug #45806 crash when replacing into a view with a join!
+--echo # 
+CREATE TABLE t1(a INT UNIQUE);
+CREATE VIEW v1 AS SELECT t1.a FROM t1, t1 AS a;
+INSERT INTO t1 VALUES (1), (2);
+
+REPLACE INTO v1(a) SELECT 1 FROM t1,t1 AS c;
+SELECT * FROM v1;
+REPLACE INTO v1(a) SELECT 3 FROM t1,t1 AS c;
+SELECT * FROM v1;
+DELETE FROM t1 WHERE a=3;
+INSERT INTO v1(a) SELECT 1 FROM t1,t1 AS c
+ON DUPLICATE KEY UPDATE `v1`.`a`= 1;
+SELECT * FROM v1;
+
+CREATE VIEW v2 AS SELECT t1.a FROM t1, v1 AS a;
+
+REPLACE INTO v2(a) SELECT 1 FROM t1,t1 AS c;
+SELECT * FROM v2;
+REPLACE INTO v2(a) SELECT 3 FROM t1,t1 AS c;
+SELECT * FROM v2;
+INSERT INTO v2(a) SELECT 1 FROM t1,t1 AS c
+ON DUPLICATE KEY UPDATE `v2`.`a`= 1;
+SELECT * FROM v2;
+
+DROP VIEW v1;
+DROP VIEW v2;
+DROP TABLE t1;
+
+--echo # -- End of test case for Bug#45806
+
 --echo # -----------------------------------------------------------------
 --echo # -- End of 5.0 tests.
 --echo # -----------------------------------------------------------------

=== modified file 'mysql-test/t/warnings.test'
--- a/mysql-test/t/warnings.test	2009-02-05 09:49:32 +0000
+++ b/mysql-test/t/warnings.test	2009-07-03 08:22:06 +0000
@@ -225,4 +225,11 @@ insert into t2 values(@q);
 
 drop table t1, t2;
 
+#
+# Bug#42364 SHOW ERRORS returns empty resultset after dropping non existent table
+#
+--error ER_BAD_TABLE_ERROR
+DROP TABLE t1;
+SHOW ERRORS;
+
 --echo End of 5.0 tests

=== modified file 'sql/sql_insert.cc'
--- a/sql/sql_insert.cc	2009-06-22 14:01:42 +0000
+++ b/sql/sql_insert.cc	2009-07-03 08:39:22 +0000
@@ -1116,6 +1116,33 @@ static bool mysql_prepare_insert_check_t
 
 
 /*
+  Get extra info for tables we insert into
+
+  @param table     table(TABLE object) we insert into,
+                   might be NULL in case of view
+  @param           table(TABLE_LIST object) or view we insert into
+*/
+
+static void prepare_for_positional_update(TABLE *table, TABLE_LIST *tables)
+{
+  if (table)
+  {
+    if(table->reginfo.lock_type != TL_WRITE_DELAYED)
+      table->prepare_for_position();
+    return;
+  }
+
+  DBUG_ASSERT(tables->view);
+  List_iterator<TABLE_LIST> it(*tables->view_tables);
+  TABLE_LIST *tbl;
+  while ((tbl= it++))
+    prepare_for_positional_update(tbl->table, tbl);
+
+  return;
+}
+
+
+/*
   Prepare items in INSERT statement
 
   SYNOPSIS
@@ -1264,9 +1291,8 @@ bool mysql_prepare_insert(THD *thd, TABL
     Only call prepare_for_posistion() if we are not performing a DELAYED
     operation. It will instead be executed by delayed insert thread.
   */
-  if ((duplic == DUP_UPDATE || duplic == DUP_REPLACE) &&
-      (table->reginfo.lock_type != TL_WRITE_DELAYED))
-    table->prepare_for_position();
+  if (duplic == DUP_UPDATE || duplic == DUP_REPLACE)
+    prepare_for_positional_update(table, table_list);
   DBUG_RETURN(FALSE);
 }
 

=== modified file 'sql/sql_table.cc'
--- a/sql/sql_table.cc	2009-06-29 14:00:47 +0000
+++ b/sql/sql_table.cc	2009-07-03 08:22:06 +0000
@@ -1995,6 +1995,7 @@ int mysql_rm_table_part2(THD *thd, TABLE
   pthread_mutex_unlock(&LOCK_open);
   thd->thread_specific_used|= tmp_table_deleted;
   error= 0;
+  thd->no_warnings_for_error= 0;
   if (wrong_tables.length())
   {
     if (!foreign_key_error)
@@ -2056,7 +2057,6 @@ int mysql_rm_table_part2(THD *thd, TABLE
 err_with_placeholders:
   unlock_table_names(thd, tables, (TABLE_LIST*) 0);
   pthread_mutex_unlock(&LOCK_open);
-  thd->no_warnings_for_error= 0;
   DBUG_RETURN(error);
 }
 

=== modified file 'tests/mysql_client_test.c'
--- a/tests/mysql_client_test.c	2009-07-01 12:32:04 +0000
+++ b/tests/mysql_client_test.c	2009-07-03 08:22:06 +0000
@@ -4769,6 +4769,8 @@ static void test_errors()
   result= mysql_store_result(mysql);
   mytest(result);
 
+  DIE_UNLESS(mysql_num_rows(result) == 1);
+
   (void) my_process_result_set(result);
   mysql_free_result(result);
 }


Attachment: [text/bzr-bundle] bzr/sergey.glukhov@sun.com-20090703083922-a6ejp0imgq25b9tb.bundle
Thread
bzr push into mysql-5.1-bugteam branch (Sergey.Glukhov:2993 to 2995)Sergey Glukhov3 Jul 2009