List:Commits« Previous MessageNext Message »
From:konstantin Date:June 22 2006 5:29pm
Subject:bk commit into 5.0 tree (konstantin:1.2191) BUG#15217
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of kostja. When kostja 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.2191 06/06/22 19:29:48 konstantin@stripped +3 -0
  A fix and a test case for Bug#15217 "Using a SP cursor on a table created
   with PREPARE fails with weird error".
  More generally, re-executing a stored procedure with a complex SP cursor query
  could lead to a crash.
  
  The cause of the problem was that SP cursor queries were not optimized 
  properly at first execution: their parse tree belongs to sp_instr_cpush,
  not sp_instr_copen, and thus the tree was tagged "EXECUTED" when the
  cursor was declared, not when it was opened. This led to loss of optimization
  transformations performed at first execution, as sp_instr_copen saw that the
  query is already "EXECUTED" and therefore either not ran first-execution 
  related blocks or wrongly rolled back the transformations caused by 
  first-execution code.
  The fix is to update the state of the parsed tree only when the tree is
  executed, as opposed to when the instruction containing the tree is executed.
  Assignment if i->state is moved to reset_lex_and_exec_core.

  sql/sp_head.cc
    1.215 06/06/22 19:29:45 konstantin@stripped +3 -1
    Move assignment of stmt_arena->state to reset_lex_and_exec_core

  mysql-test/t/sp.test
    1.189 06/06/22 19:29:45 konstantin@stripped +27 -0
    Add a test case for Bug#15217

  mysql-test/r/sp.result
    1.201 06/06/22 19:29:44 konstantin@stripped +21 -0
    Test results fixed (Bug#15217)

# 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:	konstantin
# Host:	bodhi.netgear
# Root:	/opt/local/work/mysql-5.0-15217

--- 1.200/mysql-test/r/sp.result	2006-05-18 14:44:12 +04:00
+++ 1.201/mysql-test/r/sp.result	2006-06-22 19:29:44 +04:00
@@ -4990,4 +4990,25 @@
 DROP FUNCTION bug18037_f1|
 DROP PROCEDURE bug18037_p1|
 DROP PROCEDURE bug18037_p2|
+drop table if exists t3|
+drop procedure if exists bug15217|
+create table t3 as select 1|
+create procedure bug15217()
+begin
+declare var1 char(255);
+declare cur1 cursor for select * from t3;
+open cur1;
+fetch cur1 into var1;
+select concat('data was: /', var1, '/');
+close cur1;
+end |
+call bug15217()|
+concat('data was: /', var1, '/')
+data was: /1/
+flush tables |
+call bug15217()|
+concat('data was: /', var1, '/')
+data was: /1/
+drop table t3|
+drop procedure bug15217|
 drop table t1,t2;

--- 1.188/mysql-test/t/sp.test	2006-05-18 14:44:12 +04:00
+++ 1.189/mysql-test/t/sp.test	2006-06-22 19:29:45 +04:00
@@ -5888,6 +5888,33 @@
 DROP PROCEDURE bug18037_p1|
 DROP PROCEDURE bug18037_p2|
 
+#
+# Bug#15217 "Using a SP cursor on a table created with PREPARE fails with
+#           weird error". Check that the code that is supposed to work at
+#           the first execution of a stored procedure actually works for
+#           sp_instr_copen.
+
+--disable_warnings
+drop table if exists t3|
+drop procedure if exists bug15217|
+--enable_warnings
+create table t3 as select 1|
+create procedure bug15217()
+begin
+  declare var1 char(255);
+  declare cur1 cursor for select * from t3;
+  open cur1;
+  fetch cur1 into var1;
+  select concat('data was: /', var1, '/');
+  close cur1;
+end |
+# Returns expected result
+call bug15217()|
+flush tables |
+# Returns error with garbage as column name
+call bug15217()|
+drop table t3|
+drop procedure bug15217|
 
 #
 # BUG#NNNN: New bug synopsis

--- 1.214/sql/sp_head.cc	2006-05-23 23:00:59 +04:00
+++ 1.215/sql/sp_head.cc	2006-06-22 19:29:45 +04:00
@@ -1075,7 +1075,6 @@
     thd->net.no_send_error= 0;
     if (i->free_list)
       cleanup_items(i->free_list);
-    i->state= Query_arena::EXECUTED;
     
     /* 
       If we've set thd->user_var_events_alloc to mem_root of this SP
@@ -2210,6 +2209,9 @@
     m_lex->mark_as_requiring_prelocking(NULL);
   }
   thd->rollback_item_tree_changes();
+  /* Update the state of the active arena. */
+  thd->stmt_arena->state= Query_arena::EXECUTED;
+
 
   /*
     Unlike for PS we should not call Item's destructors for newly created
Thread
bk commit into 5.0 tree (konstantin:1.2191) BUG#15217konstantin22 Jun