List:Internals« Previous MessageNext Message »
From:konstantin Date:June 22 2005 7:59am
Subject:bk commit into 5.0 tree (konstantin:1.1974)
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.1974 05/06/22 11:59:13 konstantin@stripped +7 -0
  Adjust to the changed Query_arena constructor:
  main_mem_root is moved out of class Query_arena.

  sql/sql_select.h
    1.88 05/06/22 11:59:07 konstantin@stripped +2 -1
    main_mem_root is moved out of class Query_arena.

  sql/sql_select.cc
    1.345 05/06/22 11:59:07 konstantin@stripped +10 -1
    New Cursor constructor, which avoids unneeded memory allocation
    when initializign main_mem_root.

  sql/sql_prepare.cc
    1.126 05/06/22 11:59:07 konstantin@stripped +1 -1
    It's better to not use main_mem_root anywhere: logically, it's not
    a public member (can't fix sp_head::make_field and Item_subselect::exec
    to make it protected)

  sql/sql_class.h
    1.242 05/06/22 11:59:06 konstantin@stripped +7 -13
    main_mem_root is moved out of class Query_arena.

  sql/sql_class.cc
    1.187 05/06/22 11:59:06 konstantin@stripped +19 -63
    main_mem_root is moved out of class Query_arena: remove
    constructors no longer relevant, remove dead code.

  sql/sp_head.h
    1.57 05/06/22 11:59:06 konstantin@stripped +1 -0
    main_mem_root is moved out of class Query_arena: add it to class sp_head.

  sql/sp_head.cc
    1.147 05/06/22 11:59:06 konstantin@stripped +2 -2
    Adjust to the changed Query_arena constructor. 
    main_mem_root is moved out of class Query_arena.

# 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:	dragonfly.local
# Root:	/opt/local/work/mysql-5.0-10736-new

--- 1.186/sql/sql_class.cc	2005-06-20 10:33:54 +04:00
+++ 1.187/sql/sql_class.cc	2005-06-22 11:59:06 +04:00
@@ -420,8 +420,6 @@
 #ifndef DBUG_OFF
   dbug_sentry= THD_SENTRY_GONE;
 #endif  
-  /* Reset stmt_backup.mem_root to not double-free memory from thd.mem_root */
-  clear_alloc_root(&stmt_backup.main_mem_root);
   DBUG_VOID_RETURN;
 }
 
@@ -1474,52 +1472,6 @@
 }
 
 
-/*
-  Create arena for already constructed THD.
-
-  SYNOPSYS
-    Query_arena()
-      thd - thread for which arena is created
-
-  DESCRIPTION
-    Create arena for already existing THD using its variables as parameters
-    for memory root initialization.
-*/
-Query_arena::Query_arena(THD* thd)
-  :free_list(0), mem_root(&main_mem_root),
-   state(INITIALIZED)
-{
-  init_sql_alloc(&main_mem_root,
-                 thd->variables.query_alloc_block_size,
-                 thd->variables.query_prealloc_size);
-}
-
-
-/*
-  Create arena and optionally initialize memory root.
-
-  SYNOPSYS
-    Query_arena()
-      init_mem_root - whenever we need to initialize memory root
-
-  DESCRIPTION
-    Create arena and optionally initialize memory root with minimal
-    possible parameters.
-
-  NOTE
-    We use this constructor when arena is part of THD, but reinitialize
-    its memory root in THD::init_for_queries() before execution of real
-    statements.
-*/
-Query_arena::Query_arena(bool init_mem_root)
-  :free_list(0), mem_root(&main_mem_root),
-  state(CONVENTIONAL_EXECUTION)
-{
-  if (init_mem_root)
-    init_sql_alloc(&main_mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0);
-}
-
-
 Query_arena::Type Query_arena::type() const
 {
   DBUG_ASSERT(0); /* Should never be called */
@@ -1532,7 +1484,7 @@
 */
 
 Statement::Statement(THD *thd)
-  :Query_arena(thd),
+  :Query_arena(&main_mem_root, INITIALIZED),
   id(++thd->statement_id_counter),
   set_query_id(1),
   allow_sum_func(0),
@@ -1542,16 +1494,19 @@
   cursor(0)
 {
   name.str= NULL;
+  init_sql_alloc(&main_mem_root,
+                 thd->variables.query_alloc_block_size,
+                 thd->variables.query_prealloc_size);
 }
 
 /*
-  This constructor is called when statement is a subobject of THD:
-  Some variables are initialized in THD::init due to locking problems
-  This statement object will be used to 
+  This constructor is called when Statement is a parent of THD and
+  for the backup statement. Some variables are initialized in
+  THD::init due to locking problems.
 */
 
 Statement::Statement()
-  :Query_arena((bool)TRUE),
+  :Query_arena(&main_mem_root, CONVENTIONAL_EXECUTION),
   id(0),
   set_query_id(1),
   allow_sum_func(0),                            /* initialized later */
@@ -1560,6 +1515,12 @@
   query_length(0),                              /* in alloc_query() */
   cursor(0)
 {
+  /*
+    This is just to ensure that the destructor works correctly in
+    case of an error and the backup statement. The memory root will
+    be re-initialized in THD::init.
+  */
+  init_sql_alloc(&main_mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0);
 }
 
 
@@ -1632,16 +1593,6 @@
 #ifndef DBUG_OFF
   backup_arena= 0;
 #endif
-#ifdef NOT_NEEDED_NOW
-  /*
-    Reset backup mem_root to avoid its freeing.
-    Since Query_arena's mem_root is freed only when it is part of Statement
-    we need this only if we use some Statement's arena as backup storage.
-    But we do this only with THD::stmt_backup and this Statement is specially
-    handled in this respect. So this code is not really needed now.
-  */
-  clear_alloc_root(&backup->mem_root);
-#endif
   DBUG_VOID_RETURN;
 }
 
@@ -1654,6 +1605,11 @@
 
 Statement::~Statement()
 {
+  /*
+    We must free `main_mem_root', not `mem_root' (pointer), to work
+    correctly if this statement is used as a backup statement,
+    for which `mem_root' may point to some other statement.
+  */
   free_root(&main_mem_root, MYF(0));
 }
 

--- 1.241/sql/sql_class.h	2005-06-21 18:18:22 +04:00
+++ 1.242/sql/sql_class.h	2005-06-22 11:59:06 +04:00
@@ -661,7 +661,6 @@
     itself to the list on creation (see Item::Item() for details))
   */
   Item *free_list;
-  MEM_ROOT main_mem_root;
   MEM_ROOT *mem_root;                   // Pointer to current memroot
 #ifndef DBUG_OFF
   bool backup_arena;
@@ -680,21 +679,14 @@
     STATEMENT, PREPARED_STATEMENT, STORED_PROCEDURE
   };
 
+  Query_arena(MEM_ROOT *mem_root_arg, enum enum_state state_arg) :
+    free_list(0), mem_root(mem_root_arg), state(state_arg)
+  {}
   /*
     This constructor is used only when Query_arena is created as
     backup storage for another instance of Query_arena.
   */
   Query_arena() {};
-  /*
-    Create arena for already constructed THD using its variables as
-    parameters for memory root initialization.
-  */
-  Query_arena(THD *thd);
-  /*
-    Create arena and optionally init memory root with minimal values.
-    Particularly used if Query_arena is part of Statement.
-  */
-  Query_arena(bool init_mem_root);
   virtual Type type() const;
   virtual ~Query_arena() {};
 
@@ -708,6 +700,7 @@
   { return state == PREPARED || state == EXECUTED; }
   inline bool is_conventional() const
   { return state == CONVENTIONAL_EXECUTION; }
+
   inline gptr alloc(unsigned int size) { return alloc_root(mem_root,size); }
   inline gptr calloc(unsigned int size)
   {
@@ -757,7 +750,8 @@
   Statement(const Statement &rhs);              /* not implemented: */
   Statement &operator=(const Statement &rhs);   /* non-copyable */
 public:
-  /* FIXME: must be private */
+  /* FIXME: these must be protected */
+  MEM_ROOT main_mem_root;
   LEX     main_lex;
 
   /*
@@ -1388,7 +1382,7 @@
       already changed to use this arena.
     */
     if (!current_arena->is_conventional() &&
-        mem_root != &current_arena->main_mem_root)
+        mem_root != current_arena->mem_root)
     {
       set_n_backup_item_arena(current_arena, backup);
       return current_arena;

--- 1.344/sql/sql_select.cc	2005-06-21 00:28:18 +04:00
+++ 1.345/sql/sql_select.cc	2005-06-22 11:59:07 +04:00
@@ -1708,7 +1708,16 @@
 
 
 /************************* Cursor ******************************************/
-  
+
+Cursor::Cursor(THD *thd)
+  :Query_arena(&main_mem_root, INITIALIZED),
+   join(0), unit(0)
+{
+  /* We will overwrite it at open anyway. */
+  init_sql_alloc(&main_mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0);
+}
+
+
 void
 Cursor::init_from_thd(THD *thd)
 {

--- 1.87/sql/sql_select.h	2005-06-15 21:58:22 +04:00
+++ 1.88/sql/sql_select.h	2005-06-22 11:59:07 +04:00
@@ -372,6 +372,7 @@
 
 class Cursor: public Sql_alloc, public Query_arena
 {
+  MEM_ROOT main_mem_root;
   JOIN *join;
   SELECT_LEX_UNIT *unit;
 
@@ -396,7 +397,7 @@
   void close();
 
   void set_unit(SELECT_LEX_UNIT *unit_arg) { unit= unit_arg; }
-  Cursor() :Query_arena(TRUE), join(0), unit(0) {}
+  Cursor(THD *thd);
   ~Cursor();
 };
 

--- 1.146/sql/sp_head.cc	2005-06-21 18:18:22 +04:00
+++ 1.147/sql/sp_head.cc	2005-06-22 11:59:06 +04:00
@@ -310,7 +310,8 @@
 
 
 sp_head::sp_head()
-  :Query_arena((bool)FALSE), m_returns_cs(NULL), m_has_return(FALSE),
+  :Query_arena(&main_mem_root, INITIALIZED_FOR_SP),
+   m_returns_cs(NULL), m_has_return(FALSE),
    m_simple_case(FALSE), m_multi_results(FALSE), m_in_handler(FALSE)
 {
   extern byte *
@@ -319,7 +320,6 @@
     *sp_lex_sp_key(const byte *ptr, uint *plen, my_bool first);
   DBUG_ENTER("sp_head::sp_head");
 
-  state= INITIALIZED_FOR_SP;
   m_backpatch.empty();
   m_lex.empty();
   hash_init(&m_sptabs, system_charset_info, 0, 0, 0, sp_table_key, 0, 0);

--- 1.56/sql/sp_head.h	2005-06-15 22:23:59 +04:00
+++ 1.57/sql/sp_head.h	2005-06-22 11:59:06 +04:00
@@ -79,6 +79,7 @@
   sp_head(const sp_head &);	/* Prevent use of these */
   void operator=(sp_head &);
 
+  MEM_ROOT main_mem_root;
 public:
 
   int m_type;			// TYPE_ENUM_FUNCTION or TYPE_ENUM_PROCEDURE

--- 1.125/sql/sql_prepare.cc	2005-06-20 15:38:09 +04:00
+++ 1.126/sql/sql_prepare.cc	2005-06-22 11:59:07 +04:00
@@ -2002,7 +2002,7 @@
     {
       DBUG_PRINT("info",("Using READ_ONLY cursor"));
       if (!cursor &&
-          !(cursor= stmt->cursor= new (&stmt->main_mem_root) Cursor()))
+          !(cursor= stmt->cursor= new (stmt->mem_root) Cursor(thd)))
         DBUG_VOID_RETURN;
       /* If lex->result is set, mysql_execute_command will use it */
       stmt->lex->result= &cursor->result;
Thread
bk commit into 5.0 tree (konstantin:1.1974)konstantin22 Jun