MySQL Lists are EOL. Please join:

List:Internals« Previous MessageNext Message »
From:sanja Date:June 25 2005 8:26am
Subject:bk commit into 5.0 tree (bell:1.1981) BUG#11337
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of bell. When bell 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
  1.1981 05/06/25 11:26:11 bell@stripped +5 -0
  fixed environment creation and cleaning up for processing view one by one during checking (BUG#11337)

  sql/sql_table.cc
    1.254 05/06/25 11:26:07 bell@stripped +14 -8
    fixed environment creation and cleaning up for processing view one by one (BUG#11337)

  sql/sql_lex.h
    1.186 05/06/25 11:26:07 bell@stripped +8 -3
    methods for lex cleunup during view processing one by one

  sql/sql_lex.cc
    1.151 05/06/25 11:26:06 bell@stripped +39 -0
    environment cleaning up for processing view one by one

  mysql-test/t/view.test
    1.74 05/06/25 11:26:06 bell@stripped +38 -0
    checking views after some view with error (BUG#11337)

  mysql-test/r/view.result
    1.86 05/06/25 11:26:06 bell@stripped +53 -0
    checking views after some view with error (BUG#11337)

# 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:	bell
# Host:	sanja.is.com.ua
# Root:	/home/bell/mysql/bk/work-bug4-5.0

--- 1.150/sql/sql_lex.cc	Fri Jun 17 22:27:21 2005
+++ 1.151/sql/sql_lex.cc	Sat Jun 25 11:26:06 2005
@@ -1916,6 +1916,45 @@
 }
 
 
+
+/*
+  cleanup lex for case when we open table by table for processing
+
+  SYNOPSIS
+    st_lex::cleanup_after_one_table_open()
+*/
+
+void st_lex::cleanup_after_one_table_open()
+{
+  /*
+    thd->lex->derived_tables & additional units may be set if we open
+    a view. It is necessary to clear thd->lex->derived_tables flag
+    to prevent processing of derived tables during next open_and_lock_tables
+    if next table is a real table and cleanup & remove underlying units
+    NOTE: all units will be connected to thd->lex->select_lex, because we
+    have not UNION on most upper level.
+    */
+  if (all_selects_list != &select_lex)
+  {
+    derived_tables= 0;
+    /* cleunup underlying units (units of VIEW) */
+    for (SELECT_LEX_UNIT *un= select_lex.first_inner_unit();
+         un;
+         un= un->next_unit())
+      un->cleanup();
+    /* reduce all selects list to default state */
+    all_selects_list= &select_lex;
+    /* remove underlying units (units of VIEW) subtree */
+    select_lex.cut_subtree();
+  }
+  time_zone_tables_used= 0;
+  if (spfuns.records)
+    my_hash_reset(&spfuns);
+  if (spprocs.records)
+    my_hash_reset(&spprocs);
+}
+
+
 /*
   fix some structures at the end of preparation
 

--- 1.185/sql/sql_lex.h	Tue Jun 21 17:18:23 2005
+++ 1.186/sql/sql_lex.h	Sat Jun 25 11:26:07 2005
@@ -371,7 +371,6 @@
    SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group 
    SELECT_LEXs
 */
-struct st_lex;
 class THD;
 class select_result;
 class JOIN;
@@ -627,7 +626,13 @@
     order_list.first= 0;
     order_list.next= (byte**) &order_list.first;
   }
-  
+  /*
+    This method created for reiniting LEX in mysql_admin_table() and can be
+    used only if you are going remove all SELECT_LEX & units except belonger
+    to LEX (LEX::unit & LEX::select, for other purposes there are
+    SELECT_LEX_UNIT::exclude_level & SELECT_LEX_UNIT::exclude_tree
+  */
+  void cut_subtree() { slave= 0; }
   bool test_limit();
 
   friend void lex_start(THD *thd, uchar *buf, uint length);
@@ -912,7 +917,7 @@
   {
     return ( query_tables_own_last ? *query_tables_own_last : 0);
   }
-
+  void cleanup_after_one_table_open();
 } LEX;
 
 struct st_lex_local: public st_lex

--- 1.253/sql/sql_table.cc	Sat Jun 18 00:14:28 2005
+++ 1.254/sql/sql_table.cc	Sat Jun 25 11:26:07 2005
@@ -2103,6 +2103,7 @@
 }
 
 
+
 /*
   RETURN VALUES
     FALSE Message sent to net (admin operation went ok)
@@ -2122,10 +2123,12 @@
                                                             HA_CHECK_OPT *),
                               int (view_operator_func)(THD *, TABLE_LIST*))
 {
-  TABLE_LIST *table, *next_global_table;
+  TABLE_LIST *table, *next_global_table, *next_local_table;
+  SELECT_LEX *select= &thd->lex->select_lex;
   List<Item> field_list;
   Item *item;
   Protocol *protocol= thd->protocol;
+  LEX *lex= thd->lex;
   int result_code;
   DBUG_ENTER("mysql_admin_table");
 
@@ -2154,10 +2157,17 @@
     /* open only one table from local list of command */
     next_global_table= table->next_global;
     table->next_global= 0;
+    next_local_table= table->next_local;
+    table->next_local= 0;
+    select->table_list.first= (byte*)table;
+    lex->query_tables= table;
+    lex->query_tables_last= &table->next_global;
+    lex->query_tables_own_last= 0;;
     thd->no_warnings_for_error= no_warnings_for_error;
     open_and_lock_tables(thd, table);
     thd->no_warnings_for_error= 0;
     table->next_global= next_global_table;
+    table->next_local= next_local_table;
     /* if view are unsupported */
     if (table->view && view_operator_func == NULL)
     {
@@ -2205,7 +2215,9 @@
         err_msg= (const char *)buf;
       }
       protocol->store(err_msg, system_charset_info);
+      lex->cleanup_after_one_table_open();
       thd->clear_error();
+      close_thread_tables(thd);
       if (protocol->write())
 	goto err;
       continue;
@@ -2274,6 +2286,7 @@
 
 send_result:
 
+    lex->cleanup_after_one_table_open();
     thd->clear_error();  // these errors shouldn't get client
     protocol->prepare_for_resend();
     protocol->store(table_name, system_charset_info);
@@ -2401,13 +2414,6 @@
     }
     close_thread_tables(thd);
     table->table=0;				// For query cache
-    /*
-      thd->lex->derived_tables may be set to non zero value if we open 
-      a view. It is necessary to clear thd->lex->derived_tables flag 
-      to prevent processing of derived tables during next open_and_lock_tables
-      if next table is a real table.
-    */
-    thd->lex->derived_tables= 0;
     if (protocol->write())
       goto err;
   }

--- 1.85/mysql-test/r/view.result	Wed Jun 22 08:52:02 2005
+++ 1.86/mysql-test/r/view.result	Sat Jun 25 11:26:06 2005
@@ -1831,3 +1831,56 @@
 t
 01:00
 drop view v1;
+CREATE TABLE t1 (col1 time);
+CREATE TABLE t2 (col1 time);
+CREATE VIEW v1 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t1;
+CREATE VIEW v2 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t2;
+CREATE VIEW v3 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t1;
+CREATE VIEW v4 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t2;
+CREATE VIEW v5 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t1;
+CREATE VIEW v6 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t2;
+DROP TABLE t1;
+CHECK TABLE v1, v2, v3, v4, v5, v6;
+Table	Op	Msg_type	Msg_text
+test.v1	check	error	View 'test.v1' references invalid table(s) or column(s) or function(s)
+test.v2	check	status	OK
+test.v3	check	error	View 'test.v3' references invalid table(s) or column(s) or function(s)
+test.v4	check	status	OK
+test.v5	check	error	View 'test.v5' references invalid table(s) or column(s) or function(s)
+test.v6	check	status	OK
+drop view v1, v2, v3, v4, v5, v6;
+drop table t2;
+CREATE TABLE t1 (col1 time);
+CREATE TABLE t2 (col1 time);
+CREATE TABLE t3 (col1 time);
+create function f1 () returns int return (select max(col1) from t1);
+create function f2 () returns int return (select max(col1) from t2);
+CREATE VIEW v1 AS SELECT f1() FROM t3;
+CREATE VIEW v2 AS SELECT f2() FROM t3;
+CREATE VIEW v3 AS SELECT f1() FROM t3;
+CREATE VIEW v4 AS SELECT f2() FROM t3;
+CREATE VIEW v5 AS SELECT f1() FROM t3;
+CREATE VIEW v6 AS SELECT f2() FROM t3;
+drop function f1;
+CHECK TABLE v1, v2, v3, v4, v5, v6;
+Table	Op	Msg_type	Msg_text
+test.v1	check	error	View 'test.v1' references invalid table(s) or column(s) or function(s)
+test.v2	check	status	OK
+test.v3	check	error	View 'test.v3' references invalid table(s) or column(s) or function(s)
+test.v4	check	status	OK
+test.v5	check	error	View 'test.v5' references invalid table(s) or column(s) or function(s)
+test.v6	check	status	OK
+create function f1 () returns int return (select max(col1) from t1);
+DROP TABLE t1;
+CHECK TABLE v1, v2, v3, v4, v5, v6;
+Table	Op	Msg_type	Msg_text
+test.v1	check	error	Table 'test.t1' doesn't exist
+test.v2	check	status	OK
+test.v3	check	error	Table 'test.t1' doesn't exist
+test.v4	check	status	OK
+test.v5	check	error	Table 'test.t1' doesn't exist
+test.v6	check	status	OK
+drop function f1;
+drop function f2;
+drop view v1, v2, v3, v4, v5, v6;
+drop table t2,t3;

--- 1.73/mysql-test/t/view.test	Wed Jun 22 08:42:00 2005
+++ 1.74/mysql-test/t/view.test	Sat Jun 25 11:26:06 2005
@@ -1673,3 +1673,41 @@
 create view v1 as SELECT TIME_FORMAT(SEC_TO_TIME(3600),'%H:%i') as t;
 select * from v1;
 drop view v1;
+
+#
+# checking views after some view with error (BUG#11337)
+#
+CREATE TABLE t1 (col1 time);
+CREATE TABLE t2 (col1 time);
+CREATE VIEW v1 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t1;
+CREATE VIEW v2 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t2;
+CREATE VIEW v3 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t1;
+CREATE VIEW v4 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t2;
+CREATE VIEW v5 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t1;
+CREATE VIEW v6 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t2;
+DROP TABLE t1;
+CHECK TABLE v1, v2, v3, v4, v5, v6;
+drop view v1, v2, v3, v4, v5, v6;
+drop table t2;
+
+CREATE TABLE t1 (col1 time);
+CREATE TABLE t2 (col1 time);
+CREATE TABLE t3 (col1 time);
+create function f1 () returns int return (select max(col1) from t1);
+create function f2 () returns int return (select max(col1) from t2);
+CREATE VIEW v1 AS SELECT f1() FROM t3;
+CREATE VIEW v2 AS SELECT f2() FROM t3;
+CREATE VIEW v3 AS SELECT f1() FROM t3;
+CREATE VIEW v4 AS SELECT f2() FROM t3;
+CREATE VIEW v5 AS SELECT f1() FROM t3;
+CREATE VIEW v6 AS SELECT f2() FROM t3;
+drop function f1;
+CHECK TABLE v1, v2, v3, v4, v5, v6;
+create function f1 () returns int return (select max(col1) from t1);
+DROP TABLE t1;
+# following will show underlying table until BUG#11555 fix
+CHECK TABLE v1, v2, v3, v4, v5, v6;
+drop function f1;
+drop function f2;
+drop view v1, v2, v3, v4, v5, v6;
+drop table t2,t3;
Thread
bk commit into 5.0 tree (bell:1.1981) BUG#11337sanja25 Jun