MySQL Lists are EOL. Please join:

List:Internals« Previous MessageNext Message »
From:Sergey Petrunia Date:August 3 2005 3:37am
Subject:bk commit into 5.0 tree (sergefp:1.1884)
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of psergey. When psergey 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.1884 05/08/03 03:37:32 sergefp@stripped +12 -0
  Prelocking-free SPs, post-review fixes:
  * Don't activate prelocking mode for evaluating procedure arguments when it is not necessary.
  * Code structure simplification and cleanup.
  * Cleanup in .test files

  sql/sql_class.cc
    1.196 05/08/03 03:37:28 sergefp@stripped +2 -2
    Prelocking-free SPs, post-review fixes: Initialize THD members in the order they are declared.

  sql/sql_base.cc
    1.273 05/08/03 03:37:28 sergefp@stripped +15 -16
    Prelocking-free SPs, post-review fixes:
    * Use a better defined sp_get_prelocking_info() function to get info about 
      statement prelocking options
    * Don't activate prelocked mode for evaluation of SP arguments that use tables 
      but don't need prelocking.

  sql/sp_head.cc
    1.161 05/08/03 03:37:28 sergefp@stripped +20 -38
    Prelocking-free SPs, post-review fixes: Amend the comments, simplify the code that 
    attaches removes statement's prelocking tables. 

  sql/sp_cache.h
    1.10 05/08/03 03:37:27 sergefp@stripped +2 -1
    Prelocking-free SPs, post-review fixes: Amended the comments

  sql/sp.h
    1.26 05/08/03 03:37:27 sergefp@stripped +2 -2
    Prelocking-free SPs, post-review fixes: New, better defined, sp_get_prelocking_info() 
    function to get info about statement prelocking options

  sql/sp.cc
    1.85 05/08/03 03:37:27 sergefp@stripped +21 -22
    New, better defined, sp_get_prelocking_info() function to get info about
      statement prelocking options

  mysql-test/t/sp.test
    1.135 05/08/03 03:37:27 sergefp@stripped +1 -61
    Prelocking-free SPs, post-review fixes:
    remove redundant "drop table if exists t3" statements

  mysql-test/t/sp-security.test
    1.20 05/08/03 03:37:27 sergefp@stripped +1 -1
    Don't drop the table we're not using.

  mysql-test/t/sp-prelocking.test
    1.2 05/08/03 03:37:27 sergefp@stripped +15 -9
    Prelocking-free SPs, post-review fixes:
    Added comment, s/testdb/mysqltest/, fixed a wrong test (error wasnt reported because of known bug in mysqltestrun)

  mysql-test/r/sp.result
    1.140 05/08/03 03:37:27 sergefp@stripped +1 -21
    Prelocking-free SPs, post-review fixes:
    remove redundant "drop table if exists t3" statements

  mysql-test/r/sp-security.result
    1.18 05/08/03 03:37:27 sergefp@stripped +1 -1
    Don't drop the table we're not using.

  mysql-test/r/sp-prelocking.result
    1.2 05/08/03 03:37:27 sergefp@stripped +11 -15
    Prelocking-free SPs, post-review fixes:
    Added comment, s/testdb/mysqltest/, fixed a wrong test (error wasnt reported because of known bug in mysqltestrun)

# 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:	sergefp
# Host:	newbox.mylan
# Root:	/home/psergey/mysql-5.0-sp-no-lock-r6

--- 1.272/sql/sql_base.cc	2005-07-30 08:19:50 +00:00
+++ 1.273/sql/sql_base.cc	2005-08-03 03:37:28 +00:00
@@ -1865,23 +1865,21 @@
           document new prelocked behavior.
   */
   
-  if (!thd->prelocked_mode && !thd->lex->requires_prelocking())
+  if (!thd->prelocked_mode && !thd->lex->requires_prelocking() && 
+      thd->lex->sroutines_list.elements)
   {
-    bool first_no_prelocking;
-    if (sp_need_cache_routines(thd, &thd->lex->sroutines_list,
-                               &first_no_prelocking))
-    {
-      TABLE_LIST **save_query_tables_last= thd->lex->query_tables_last;
+    bool first_no_prelocking, need_prelocking;
+    TABLE_LIST **save_query_tables_last= thd->lex->query_tables_last;
 
-      DBUG_ASSERT(thd->lex->query_tables == *start);
+    DBUG_ASSERT(thd->lex->query_tables == *start);
+    sp_get_prelocking_info(thd, &need_prelocking, &first_no_prelocking);
 
-      if (sp_cache_routines_and_add_tables(thd, thd->lex,
-                                           first_no_prelocking) ||
-          *start)
-      {
-        query_tables_last_own= save_query_tables_last;
-        *start= thd->lex->query_tables;
-      }
+    if ((sp_cache_routines_and_add_tables(thd, thd->lex,
+                                         first_no_prelocking) ||
+        *start) && need_prelocking)
+    {
+      query_tables_last_own= save_query_tables_last;
+      *start= thd->lex->query_tables;
     }
   }
 
@@ -1917,8 +1915,9 @@
           2) Tables used by all stored routines that this statement invokes on
              execution.
           We need to know where the bound between these two parts is. If we've
-          just opened the last table in part #1, and it added tables after
-          itself, adjust the boundary pointer accordingly.
+          just opened a view, which was the last table in part #1, and it
+          has added its base tables after itself, adjust the boundary pointer
+          accordingly.
         */
         if (query_tables_last_own &&
             query_tables_last_own == &(tables->next_global) &&

--- 1.195/sql/sql_class.cc	2005-07-30 08:19:50 +00:00
+++ 1.196/sql/sql_class.cc	2005-08-03 03:37:28 +00:00
@@ -174,11 +174,11 @@
   :Statement(CONVENTIONAL_EXECUTION, 0, ALLOC_ROOT_MIN_BLOCK_SIZE, 0),
    Open_tables_state(),
    lock_id(&main_lock_id),
-   user_time(0), global_read_lock(0), is_fatal_error(0),
+   user_time(0), in_sub_stmt(FALSE), global_read_lock(0), is_fatal_error(0),
    rand_used(0), time_zone_used(0),
    last_insert_id_used(0), insert_id_used(0), clear_next_insert_id(0),
    in_lock_tables(0), bootstrap(0), derived_tables_processing(FALSE),
-   spcont(NULL), in_sub_stmt(FALSE)
+   spcont(NULL)
 {
   current_arena= this;
   host= user= priv_user= db= ip= 0;

--- 1.17/mysql-test/r/sp-security.result	2005-07-30 08:19:50 +00:00
+++ 1.18/mysql-test/r/sp-security.result	2005-08-03 03:37:27 +00:00
@@ -1,7 +1,7 @@
 use test;
 grant usage on *.* to user1@localhost;
 flush privileges;
-drop table if exists t1,t2;
+drop table if exists t1;
 drop database if exists db1_secret;
 create database db1_secret;
 create procedure db1_secret.dummy() begin end;

--- 1.139/mysql-test/r/sp.result	2005-07-30 08:19:50 +00:00
+++ 1.140/mysql-test/r/sp.result	2005-08-03 03:37:27 +00:00
@@ -84,7 +84,6 @@
 kaka	3
 delete from t1|
 drop procedure setcontext|
-drop table if exists t3|
 create table t3 ( d date, i int, f double, s varchar(32) )|
 drop procedure if exists nullset|
 create procedure nullset()
@@ -520,7 +519,6 @@
 insert into test.t3 values ("into4", x);
 end|
 delete from t1|
-drop table if exists t3|
 create table t3 ( s char(16), d int)|
 call into_test4()|
 Warnings:
@@ -564,13 +562,12 @@
 create temporary table test.t3 select * from test.t1;
 insert into test.t3 values (concat(x, "2"), y+2);
 end|
-drop table if exists t3|
 call create_select("cs", 90)|
 select * from t1, t3|
 id	data	id	data
 cs	90	cs	90
 cs	90	cs2	92
-drop table if exists t3|
+drop table t3|
 delete from t1|
 drop procedure create_select|
 drop function if exists e|
@@ -701,7 +698,6 @@
 hndlr3	13
 delete from t1|
 drop procedure hndlr3|
-drop table if exists t3|
 create table t3 ( id   char(16), data int )|
 drop procedure if exists hndlr4|
 create procedure hndlr4()
@@ -744,7 +740,6 @@
 bar	15
 zap	663
 drop procedure cur1|
-drop table if exists t3|
 create table t3 ( s char(16), i int )|
 drop procedure if exists cur2|
 create procedure cur2()
@@ -1308,7 +1303,6 @@
 t1max()
 5
 drop function t1max|
-drop table if exists t3|
 create table t3 (
 v char(16) not null primary key,
 c int unsigned not null
@@ -1429,7 +1423,6 @@
 2	NULL
 drop table t70|
 drop procedure bug1656|
-drop table if exists t3|
 create table t3(a int)|
 drop procedure if exists bug1862|
 create procedure bug1862()
@@ -1554,7 +1547,6 @@
 42
 drop procedure bug2776_1|
 drop procedure bug2776_2|
-drop table if exists t3|
 create table t3 (s1 smallint)|
 insert into t3 values (123456789012)|
 Warnings:
@@ -1615,7 +1607,6 @@
 drop procedure bug1863|
 drop temporary table temp_t1;
 drop table t3, t4|
-drop table if exists t3, t4|
 create table t3 ( 
 OrderID  int not null,
 MarketID int,
@@ -1693,7 +1684,6 @@
 @i	time
 2	01-01-1970 03:16:40
 drop procedure bug3426|
-drop table if exists t3, t4|
 create table t3 (
 a int primary key, 
 ach char(1)
@@ -1723,7 +1713,6 @@
 1	a	1	b
 drop procedure bug3448|
 drop table t3, t4|
-drop table if exists t3|
 create table t3 (
 id int unsigned auto_increment not null primary key,
 title VARCHAR(200),
@@ -1872,7 +1861,6 @@
 1+2
 3
 drop procedure bug3843|
-drop table if exists t3|
 create table t3 ( s1 char(10) )|
 insert into t3 values ('a'), ('b')|
 drop procedure if exists bug3368|
@@ -1888,7 +1876,6 @@
 yz,yz
 drop procedure bug3368|
 drop table t3|
-drop table if exists t3|
 create table t3 (f1 int, f2 int)|
 insert into t3 values (1,1)|
 drop procedure if exists bug4579_1|
@@ -1913,7 +1900,6 @@
 drop procedure bug4579_1|
 drop procedure bug4579_2|
 drop table t3|
-drop table if exists t3|
 drop procedure if exists bug2773|
 create function bug2773() returns int return null|
 create table t3 as select bug2773()|
@@ -1935,7 +1921,6 @@
 bug3788()
 5
 drop function bug3788|
-drop table if exists t3|
 create table t3 (f1 int, f2 int, f3 int)|
 insert into t3 values (1,1,1)|
 drop procedure if exists bug4726|
@@ -2096,7 +2081,6 @@
 Id	User	Host	db	Command	Time	State	Info
 #	root	localhost	test	Query	#	NULL	show processlist
 drop procedure bug4902_2|
-drop table if exists t3|
 drop procedure if exists bug4904|
 create procedure bug4904()
 begin
@@ -2285,7 +2269,6 @@
 flush query cache|
 delete from t1|
 drop procedure bug3583|
-drop table if exists t3|
 drop procedure if exists bug4905|
 create table t3 (s1 int,primary key (s1))|
 drop procedure if exists bug4905|
@@ -2343,7 +2326,6 @@
 y	z
 1	1
 drop procedure bug8540|
-drop table if exists t3|
 create table t3 (s1 int)|
 drop procedure if exists bug6642|
 create procedure bug6642()
@@ -2426,7 +2408,6 @@
 drop procedure bug7992_1|
 drop procedure bug7992_2|
 drop table t3|
-drop table if exists t3|
 create table t3 (  userid bigint(20) not null default 0 )|
 drop procedure if exists bug8116|
 create procedure bug8116(in _userid int)
@@ -2587,7 +2568,6 @@
 drop procedure if exists bug6900|
 drop procedure if exists bug9074|
 drop procedure if exists bug6900_9074|
-drop table if exists t3|
 create table t3 (w char unique, x char)|
 insert into t3 values ('a', 'b')|
 create procedure bug6900()

--- 1.19/mysql-test/t/sp-security.test	2005-07-30 08:19:50 +00:00
+++ 1.20/mysql-test/t/sp-security.test	2005-08-03 03:37:27 +00:00
@@ -15,7 +15,7 @@
 flush privileges;
 
 --disable_warnings
-drop table if exists t1,t2;
+drop table if exists t1;
 drop database if exists db1_secret;
 --enable_warnings
 # Create our secret database

--- 1.134/mysql-test/t/sp.test	2005-07-30 08:19:50 +00:00
+++ 1.135/mysql-test/t/sp.test	2005-08-03 03:37:27 +00:00
@@ -147,9 +147,6 @@
 
 
 # Set things to null
---disable_warnings
-drop table if exists t3|
---enable_warnings
 create table t3 ( d date, i int, f double, s varchar(32) )|
 
 --disable_warnings
@@ -683,9 +680,6 @@
 end|
 
 delete from t1|
---disable_warnings
-drop table if exists t3|
---enable_warnings
 create table t3 ( s char(16), d int)|
 call into_test4()|
 select * from t3|
@@ -741,14 +735,9 @@
   insert into test.t3 values (concat(x, "2"), y+2);
 end|
 
---disable_warnings
-drop table if exists t3|
---enable_warnings
 call create_select("cs", 90)|
 select * from t1, t3|
---disable_warnings
-drop table if exists t3|
---enable_warnings
+drop table t3|
 delete from t1|
 drop procedure create_select|
 
@@ -922,9 +911,6 @@
 # Variables might be uninitialized when using handlers
 # (Otherwise the compiler can detect if a variable is not set, but
 #  not in this case.)
---disable_warnings
-drop table if exists t3|
---enable_warnings
 create table t3 ( id   char(16), data int )|
 
 --disable_warnings
@@ -977,9 +963,6 @@
 select * from t1|
 drop procedure cur1|
 
---disable_warnings
-drop table if exists t3|
---enable_warnings
 create table t3 ( s char(16), i int )|
 
 --disable_warnings
@@ -1611,9 +1594,6 @@
 select t1max()|
 drop function t1max|
 
---disable_warnings
-drop table if exists t3|
---enable_warnings
 create table t3 (
   v char(16) not null primary key,
   c int unsigned not null
@@ -1747,9 +1727,6 @@
 #
 # BUG#1862
 #
---disable_warnings
-drop table if exists t3|
---enable_warnings
 create table t3(a int)|
 
 --disable_warnings
@@ -2006,9 +1983,6 @@
 #
 # BUG#2780
 #
---disable_warnings
-drop table if exists t3|
---enable_warnings
 create table t3 (s1 smallint)|
 
 insert into t3 values (123456789012)|
@@ -2082,9 +2056,6 @@
 #
 # BUG#2656
 #
---disable_warnings
-drop table if exists t3, t4|
---enable_warnings
 
 create table t3 ( 
   OrderID  int not null,
@@ -2172,8 +2143,6 @@
 # BUG#3448
 #
 --disable_warnings
-drop table if exists t3, t4|
-
 create table t3 (
   a int primary key, 
   ach char(1)
@@ -2205,9 +2174,6 @@
 #
 # BUG#3734
 #
---disable_warnings
-drop table if exists t3|
---enable_warnings
 create table t3 (
   id int unsigned auto_increment not null primary key,
   title VARCHAR(200),
@@ -2383,9 +2349,6 @@
 #
 # BUG#3368
 #
---disable_warnings
-drop table if exists t3|
---enable_warnings
 create table t3 ( s1 char(10) )|
 insert into t3 values ('a'), ('b')|
 
@@ -2405,9 +2368,6 @@
 #
 # BUG#4579
 #
---disable_warnings
-drop table if exists t3|
---enable_warnings
 create table t3 (f1 int, f2 int)|
 insert into t3 values (1,1)|
 
@@ -2442,7 +2402,6 @@
 # BUG#2773: Function's data type ignored in stored procedures
 #
 --disable_warnings
-drop table if exists t3|
 drop procedure if exists bug2773|
 --enable_warnings
 
@@ -2471,10 +2430,6 @@
 #
 # BUG#4726
 #
---disable_warnings
-drop table if exists t3|
---enable_warnings
- 
 create table t3 (f1 int, f2 int, f3 int)|
 insert into t3 values (1,1,1)|
 
@@ -2505,9 +2460,6 @@
 # BUG#4318
 #
 #QQ Don't know if HANDLER commands can work with SPs, or at all...
-#--disable_warnings
-#drop table if exists t3|
-#--enable_warnings
 # 
 #create table t3 (s1 int)|
 #insert into t3 values (3), (4)|
@@ -2589,10 +2541,6 @@
 # BUG#4904
 #
 --disable_warnings
-drop table if exists t3|
---enable_warnings
-
---disable_warnings
 drop procedure if exists bug4904|
 --enable_warnings
 create procedure bug4904()
@@ -2845,7 +2793,6 @@
 # BUG#4905: Stored procedure doesn't clear for "Rows affected"
 #
 --disable_warnings
-drop table if exists t3|
 drop procedure if exists bug4905|
 --enable_warnings
 
@@ -2945,9 +2892,6 @@
 #
 # BUG#6642: Stored procedure crash if expression with set function
 #
---disable_warnings
-drop table if exists t3|
---enable_warnings
 create table t3 (s1 int)|
 
 --disable_warnings
@@ -3035,9 +2979,6 @@
 # BUG#8116: calling simple stored procedure twice in a row results
 #           in server crash
 #
---disable_warnings
-drop table if exists t3|
---enable_warnings
 create table t3 (  userid bigint(20) not null default 0 )|
 
 --disable_warnings
@@ -3280,7 +3221,6 @@
 drop procedure if exists bug6900|
 drop procedure if exists bug9074|
 drop procedure if exists bug6900_9074|
-drop table if exists t3|
 --enable_warnings
 
 create table t3 (w char unique, x char)|

--- 1.84/sql/sp.cc	2005-07-30 08:19:50 +00:00
+++ 1.85/sql/sp.cc	2005-08-03 03:37:27 +00:00
@@ -1176,40 +1176,39 @@
 
 
 /*
-  Check if routines in routines_list require sp_cache_routines_and_add_tables
-  call.
+  Check if
+   - current statement (the one in thd->lex) needs table prelocking
+   - first routine in thd->lex->sroutines_list needs to execute its body in
+     prelocked mode.
 
   SYNOPSIS
-    sp_need_cache_routines()
-      thd
-      routines 
-      need_skip_first  OUT TRUE - don't do prelocking for the 1st element in 
-                                  routines list.
-                           FALSE- otherwise
+    sp_get_prelocking_info()
+      thd                  Current thread, thd->lex is the statement to be
+                           checked.
+      need_prelocking      OUT TRUE  - prelocked mode should be activated
+                                       before executing the statement
+                               FALSE - Don't activate prelocking 
+      first_no_prelocking  OUT TRUE  - Tables used by first routine in
+                                       thd->lex->sroutines_list should be
+                                       prelocked.
+                               FALSE - Otherwise.
   NOTES 
     This function assumes that for any "CALL proc(...)" statement routines_list 
     will have 'proc' as first element (it may have several, consider e.g.
     "proc(sp_func(...)))". This property is currently guaranted by the parser.
-
-  RETURN
-    TRUE  Need to sp_cache_routines_and_add_tables call for this statement.
-    FALSE Otherwise.
 */
 
-bool sp_need_cache_routines(THD *thd, SQL_LIST *routines_list, bool *need_skip_first)
+void sp_get_prelocking_info(THD *thd, bool *need_prelocking, 
+                            bool *first_no_prelocking)
 {
   Sroutine_hash_entry *routine;
-  routine= (Sroutine_hash_entry*)routines_list->first;
-
-  *need_skip_first= FALSE;
-  if (!routine)
-    return FALSE;
+  routine= (Sroutine_hash_entry*)thd->lex->sroutines_list.first;
 
-  if (routine->key.str[0] != TYPE_ENUM_PROCEDURE)
-    return TRUE;
+  DBUG_ASSERT(routine);
+  bool first_is_procedure= (routine->key.str[0] == TYPE_ENUM_PROCEDURE);
 
-  *need_skip_first= TRUE;
-  return TRUE;
+  *first_no_prelocking= first_is_procedure;
+  *need_prelocking= !first_is_procedure || test(routine->next);
 }
 
 

--- 1.25/sql/sp.h	2005-07-30 08:19:50 +00:00
+++ 1.26/sql/sp.h	2005-08-03 03:37:27 +00:00
@@ -79,8 +79,8 @@
   Procedures for pre-caching of stored routines and building table list
   for prelocking.
 */
-bool sp_need_cache_routines(THD *thd, SQL_LIST *routines_list, 
-                            bool *need_skip_first);
+void sp_get_prelocking_info(THD *thd, bool *need_prelocking, 
+                            bool *first_no_prelocking);
 void sp_add_used_routine(LEX *lex, Query_arena *arena,
                          sp_name *rt, char rt_type);
 void sp_update_sp_used_routines(HASH *dst, HASH *src);

--- 1.9/sql/sp_cache.h	2005-07-30 08:19:50 +00:00
+++ 1.10/sql/sp_cache.h	2005-08-03 03:37:27 +00:00
@@ -25,7 +25,8 @@
 /*
   Stored procedures/functions cache. This is used as follows:
    * Each thread has its own cache.
-   * When SP is used it is always in some thread's cache.
+   * Each sp_head object is put into its thread cache after creation and is
+     removed from there on its deletion.
 */
 
 class sp_head;

--- 1.160/sql/sp_head.cc	2005-07-30 08:19:50 +00:00
+++ 1.161/sql/sp_head.cc	2005-08-03 03:37:28 +00:00
@@ -921,7 +921,8 @@
 
     /* 
       Okay, got values for all arguments. Close tables that might be used by 
-      arguments evaluation.
+      arguments evaluation. If arguments evaluation required prelocking mode, 
+      we'll leave it here.
     */
     if (!thd->in_sub_stmt)
       close_thread_tables(thd, 0, 0, 0);
@@ -1492,8 +1493,6 @@
            instruction if it is not really used.
   */
 
-  bool collect_prelocking_tail= FALSE;
-
   if (thd->prelocked_mode == NON_PRELOCKED)
   {
     /*
@@ -1511,14 +1510,6 @@
       *lex_query_tables_own_last= prelocking_tables;
       m_lex->mark_as_requiring_prelocking(lex_query_tables_own_last);
     }
-    else
-    {
-      /* 
-        Let open_tables_calculate list of tables that this statement needs
-        to have prelocked.
-      */
-      collect_prelocking_tail= TRUE;
-    }
   }
     
   reinit_stmt_before_use(thd, m_lex);
@@ -1539,34 +1530,25 @@
   thd->proc_info="closing tables";
   close_thread_tables(thd);
 
-  if (thd->prelocked_mode == NON_PRELOCKED)
+  if (m_lex->query_tables_own_last)
   {
-    if (!lex_query_tables_own_last)
-      lex_query_tables_own_last= thd->lex->query_tables_own_last;
-      
-    if (lex_query_tables_own_last)
-    {
-      if (collect_prelocking_tail)
-      {
-        /*
-          This is the first time this statement has entered/left prelocked
-          mode on its own. open_tables() has calculated the set of tables this
-          statement needs to have prelocked and added them to the end of
-          m_lex->query_tables(->next_global)*.
-          Save this "tail" for subsequent calls (and restore original list 
-          below)
-        */
-        lex_query_tables_own_last= m_lex->query_tables_own_last;
-        prelocking_tables= *lex_query_tables_own_last;
-      }
-      /*
-        The table list now has list of tables that need to be prelocked
-        when this statement executes, chop it off, and mark this statement 
-        as not requiring prelocking.
-      */
-      *lex_query_tables_own_last= NULL;
-      m_lex->mark_as_requiring_prelocking(NULL);
-    }
+    /*
+      We've entered and left prelocking mode when executing statement
+      stored in m_lex. 
+      m_lex->query_tables(->next_global)* list now has a 'tail' - a list
+      of tables that are added for prelocking. (If this is the first
+      execution, the 'tail' was added by open_tables(), otherwise we've
+      attached it above in this function).
+      Now we'll save the 'tail', and detach it.
+    */
+    DBUG_ASSERT(!lex_query_tables_own_last ||
+                lex_query_tables_own_last == m_lex->query_tables_own_last &&
+                prelocking_tables == *(m_lex->query_tables_own_last));
+
+    lex_query_tables_own_last= m_lex->query_tables_own_last;
+    prelocking_tables= *lex_query_tables_own_last;
+    *lex_query_tables_own_last= NULL;
+    m_lex->mark_as_requiring_prelocking(NULL);
   }
   thd->rollback_item_tree_changes();
 

--- 1.1/mysql-test/r/sp-prelocking.result	2005-07-30 08:19:51 +00:00
+++ 1.2/mysql-test/r/sp-prelocking.result	2005-08-03 03:37:27 +00:00
@@ -1,4 +1,4 @@
-drop database if exists testdb;
+drop database if exists mysqltest;
 drop table if exists t1, t2, t3, t4;
 drop procedure if exists sp1;
 drop procedure if exists sp2;
@@ -7,8 +7,8 @@
 drop function if exists f1;
 drop function if exists f2;
 drop function if exists f3;
-create database testdb;
-use testdb//
+create database mysqltest;
+use mysqltest//
 create procedure sp1 () 
 begin
 drop table if exists t1;
@@ -17,7 +17,7 @@
 //
 select database();
 database()
-testdb
+mysqltest
 call sp1();
 my-col
 1
@@ -25,12 +25,12 @@
 Note	1051	Unknown table 't1'
 select database();
 database()
-testdb
+mysqltest
 use test;
 select database();
 database()
 test
-call testdb.sp1();
+call mysqltest.sp1();
 my-col
 1
 Warnings:
@@ -38,8 +38,8 @@
 select database();
 database()
 test
-drop procedure testdb.sp1;
-drop database testdb;
+drop procedure mysqltest.sp1;
+drop database mysqltest;
 create procedure sp1() 
 begin 
 create table t1 (a int); 
@@ -95,13 +95,15 @@
 insert into t1 values(1);
 call sp1();
 select 't1', a from t1;
-select 't2', b from t2;
+select 't2', a from t2;
 drop table t1;
 drop table t2;
 end//
 call sp2();
 t1	a
 t1	1
+t2	a
+t2	1
 drop procedure sp1;
 drop procedure sp2;
 create table t1 (a int);
@@ -138,21 +140,15 @@
 call sp4();
 a
 1
-1
-1
 2
 a
 1
-1
 2
 a
 1
-1
 2
 a
 5
-drop temporary table t1;
-drop temporary table t2;
 drop procedure sp1;
 drop procedure sp2;
 drop procedure sp3;

--- 1.1/mysql-test/t/sp-prelocking.test	2005-07-30 08:19:52 +00:00
+++ 1.2/mysql-test/t/sp-prelocking.test	2005-08-03 03:37:27 +00:00
@@ -1,5 +1,13 @@
+#
+# Tests of prelocking-free execution of stored procedures.
+# Currently two properties of prelocking-free SP execution are checked:
+#  - It is possible to execute DDL statements in prelocking-free stored
+#    procedure
+#  - The same procedure can be called in prelocking-free mode and 
+#    in prelocked mode (from within a function).
+
 --disable_warnings
-drop database if exists testdb;
+drop database if exists mysqltest;
 drop table if exists t1, t2, t3, t4;
 drop procedure if exists sp1;
 drop procedure if exists sp2;
@@ -12,9 +20,9 @@
 
 # BUG#8072 
 
-create database testdb;
+create database mysqltest;
 delimiter //;
-use testdb//
+use mysqltest//
 create procedure sp1 () 
 begin
   drop table if exists t1;
@@ -29,11 +37,11 @@
 
 use test;
 select database();
-call testdb.sp1();
+call mysqltest.sp1();
 select database();
 
-drop procedure testdb.sp1;
-drop database testdb;
+drop procedure mysqltest.sp1;
+drop database mysqltest;
 
 # BUG#8766
 
@@ -96,7 +104,7 @@
   insert into t1 values(1);
   call sp1();
   select 't1', a from t1;
-  select 't2', b from t2;
+  select 't2', a from t2;
   drop table t1;
   drop table t2;
 end//
@@ -151,8 +159,6 @@
 delimiter ;//
 call sp4();
 
-drop temporary table t1;
-drop temporary table t2;
 drop procedure sp1;
 drop procedure sp2;
 drop procedure sp3;
Thread
bk commit into 5.0 tree (sergefp:1.1884)Sergey Petrunia3 Aug