List:Commits« Previous MessageNext Message »
From:<gshchepa Date:May 31 2007 12:31pm
Subject:bk commit into 5.0 tree (gshchepa:1.2506) BUG#28244
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of uchum. When uchum does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-05-31 17:30:56+05:00, gshchepa@stripped +3 -0
  Fixed bug #28244.
  When the same VIEW was created at the master side twice,
  malformed (truncated after the word 'AS') query string 
  was forwarded to client side, so error messages on the
  master and client was different, and replication was
  broken.
  
  The mysql_register_view function call failed
  too early: fields of `view' output argument of this 
  function was not filled yet with correct data required
  for query replication.
  The mysql_register_view function also copied pointers to 
  local buffers into a memory allocated by the caller.

  mysql-test/r/rpl_view.result@stripped, 2007-05-31 17:29:11+05:00, gshchepa@stripped +6 -0
    Updated test case for bug #28244.

  mysql-test/t/rpl_view.test@stripped, 2007-05-31 17:29:10+05:00, gshchepa@stripped +12 -0
    Updated test case for bug #28244.

  sql/sql_view.cc@stripped, 2007-05-31 17:16:28+05:00, gshchepa@stripped +72 -57
    Fixed bug #28244.
    Checking of existence of VIEW .frm file has been
    moved down to the place, when `view' argument is
    completely filled with proper data.
    view->query.str and view->query.md5 pointers has been
    set to the NULL before return from the mysql_register_view
    function.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	gshchepa
# Host:	gleb.loc
# Root:	/home/uchum/work/bk/mysql-5.0-opt-28244

--- 1.8/mysql-test/r/rpl_view.result	2006-11-03 15:27:32 +04:00
+++ 1.9/mysql-test/r/rpl_view.result	2007-05-31 17:29:11 +05:00
@@ -106,4 +106,10 @@ a	b
 1	6
 drop table t1;
 drop view v1;
+CREATE TABLE t1(a INT);
+CREATE VIEW v1 AS SELECT * FROM t1;
+CREATE VIEW v1 AS SELECT * FROM t1;
+ERROR 42S01: Table 'v1' already exists
+DROP VIEW v1;
+DROP TABLE t1;
 End of 5.0 tests

--- 1.6/mysql-test/t/rpl_view.test	2006-09-21 03:59:41 +05:00
+++ 1.7/mysql-test/t/rpl_view.test	2007-05-31 17:29:10 +05:00
@@ -149,4 +149,16 @@ drop view v1;
 
 sync_slave_with_master;
 
+#
+# BUG#28244 CREATE VIEW breaks replication when view exists
+#
+connection master;
+CREATE TABLE t1(a INT);
+CREATE VIEW v1 AS SELECT * FROM t1;
+--error ER_TABLE_EXISTS_ERROR
+CREATE VIEW v1 AS SELECT * FROM t1;
+DROP VIEW v1;
+DROP TABLE t1;
+sync_slave_with_master;
+
 --echo End of 5.0 tests

--- 1.110/sql/sql_view.cc	2007-04-24 20:25:51 +05:00
+++ 1.111/sql/sql_view.cc	2007-05-31 17:16:28 +05:00
@@ -692,6 +692,7 @@ static int mysql_register_view(THD *thd,
   bool can_be_merged;
   char dir_buff[FN_REFLEN], file_buff[FN_REFLEN];
   LEX_STRING dir, file;
+  int error= 0;
   DBUG_ENTER("mysql_register_view");
 
   /* print query */
@@ -702,9 +703,57 @@ static int mysql_register_view(THD *thd,
     lex->unit.print(&str);
     thd->variables.sql_mode|= sql_mode;
   }
-  str.append('\0');
   DBUG_PRINT("info", ("View: %s", str.ptr()));
 
+  /* fill structure */
+  view->query.str= str.c_ptr();
+  view->query.length= str.length();
+  view->source.str= thd->query + thd->lex->create_view_select_start;
+  view->source.length= skip_rear_comments((char *)view->source.str,
+                                          (char *)thd->query +
+                                          thd->query_length) -
+                       view->source.str;
+  view->file_version= 1;
+  view->calc_md5(md5);
+  view->md5.str= md5;
+  view->md5.length= 32;
+  can_be_merged= lex->can_be_merged();
+  if (lex->create_view_algorithm == VIEW_ALGORITHM_MERGE &&
+      !lex->can_be_merged())
+  {
+    push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_VIEW_MERGE,
+                 ER(ER_WARN_VIEW_MERGE));
+    lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED;
+  }
+  view->algorithm= lex->create_view_algorithm;
+  view->definer.user= lex->definer->user;
+  view->definer.host= lex->definer->host;
+  view->view_suid= lex->create_view_suid;
+  view->with_check= lex->create_view_check;
+  if ((view->updatable_view= (can_be_merged &&
+                              view->algorithm != VIEW_ALGORITHM_TMPTABLE)))
+  {
+    /* TODO: change here when we will support UNIONs */
+    for (TABLE_LIST *tbl= (TABLE_LIST *)lex->select_lex.table_list.first;
+	 tbl;
+	 tbl= tbl->next_local)
+    {
+      if ((tbl->view && !tbl->updatable_view) || tbl->schema_table)
+      {
+	view->updatable_view= 0;
+	break;
+      }
+      for (TABLE_LIST *up= tbl; up; up= up->embedding)
+      {
+	if (up->outer_join)
+	{
+	  view->updatable_view= 0;
+	  goto loop_out;
+	}
+      }
+    }
+  }
+loop_out:
   /* print file name */
   (void) my_snprintf(dir_buff, FN_REFLEN, "%s/%s/",
 		     mysql_data_home, view->db);
@@ -734,16 +783,21 @@ static int mysql_register_view(THD *thd,
       if (mode == VIEW_CREATE_NEW)
       {
 	my_error(ER_TABLE_EXISTS_ERROR, MYF(0), view->alias);
-	DBUG_RETURN(-1);
+        error= -1;
+        goto err;
       }
 
       if (!(parser= sql_parse_prepare(&path, thd->mem_root, 0)))
-	DBUG_RETURN(1);
+      {
+        error= 1;
+        goto err;
+      }
 
       if (!parser->ok() || !is_equal(&view_type, parser->type()))
       {
         my_error(ER_WRONG_OBJECT, MYF(0), view->db, view->table_name, "VIEW");
-        DBUG_RETURN(-1);
+        error= -1;
+        goto err;
       }
 
       /*
@@ -756,7 +810,8 @@ static int mysql_register_view(THD *thd,
                         view_parameters + revision_number_position, 1,
                         &file_parser_dummy_hook))
       {
-        DBUG_RETURN(thd->net.report_error? -1 : 0);
+        error= thd->net.report_error? -1 : 0;
+        goto err;
       }
     }
     else
@@ -764,59 +819,11 @@ static int mysql_register_view(THD *thd,
       if (mode == VIEW_ALTER)
       {
 	my_error(ER_NO_SUCH_TABLE, MYF(0), view->db, view->alias);
-	DBUG_RETURN(-1);
-      }
-    }
-  }
-  /* fill structure */
-  view->query.str= (char*)str.ptr();
-  view->query.length= str.length()-1; // we do not need last \0
-  view->source.str= thd->query + thd->lex->create_view_select_start;
-  view->source.length= (char *)skip_rear_comments((char *)view->source.str,
-                                                  (char *)thd->query +
-                                                  thd->query_length) -
-                        view->source.str;
-  view->file_version= 1;
-  view->calc_md5(md5);
-  view->md5.str= md5;
-  view->md5.length= 32;
-  can_be_merged= lex->can_be_merged();
-  if (lex->create_view_algorithm == VIEW_ALGORITHM_MERGE &&
-      !lex->can_be_merged())
-  {
-    push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_VIEW_MERGE,
-                 ER(ER_WARN_VIEW_MERGE));
-    lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED;
-  }
-  view->algorithm= lex->create_view_algorithm;
-  view->definer.user= lex->definer->user;
-  view->definer.host= lex->definer->host;
-  view->view_suid= lex->create_view_suid;
-  view->with_check= lex->create_view_check;
-  if ((view->updatable_view= (can_be_merged &&
-                              view->algorithm != VIEW_ALGORITHM_TMPTABLE)))
-  {
-    /* TODO: change here when we will support UNIONs */
-    for (TABLE_LIST *tbl= (TABLE_LIST *)lex->select_lex.table_list.first;
-	 tbl;
-	 tbl= tbl->next_local)
-    {
-      if ((tbl->view && !tbl->updatable_view) || tbl->schema_table)
-      {
-	view->updatable_view= 0;
-	break;
-      }
-      for (TABLE_LIST *up= tbl; up; up= up->embedding)
-      {
-	if (up->outer_join)
-	{
-	  view->updatable_view= 0;
-	  goto loop_out;
-	}
+        error= -1;
+        goto err;
       }
     }
   }
-loop_out:
   /*
     Check that table of main select do not used in subqueries.
 
@@ -841,15 +848,23 @@ loop_out:
       !view->updatable_view)
   {
     my_error(ER_VIEW_NONUPD_CHECK, MYF(0), view->db, view->table_name);
-    DBUG_RETURN(-1);
+    error= -1;
+    goto err;
   }
 
   if (sql_create_definition_file(&dir, &file, view_file_type,
 				 (gptr)view, view_parameters, num_view_backups))
   {
-    DBUG_RETURN(thd->net.report_error? -1 : 1);
+    error= thd->net.report_error? -1 : 1;
+    goto err;
   }
   DBUG_RETURN(0);
+err:
+  view->query.str= NULL;
+  view->query.length= 0;
+  view->md5.str= NULL;
+  view->md5.length= NULL;
+  DBUG_RETURN(error);
 }
 
 
Thread
bk commit into 5.0 tree (gshchepa:1.2506) BUG#28244gshchepa31 May