1. 19 Jul, 2007 2 commits
    • unknown's avatar
      Rename all references to 'Delayed_insert' instances from 'tmp' to 'di' · cd7e1d71
      unknown authored
      for consistency.
      
      cd7e1d71
    • unknown's avatar
      A fix for Bug#29431 killing an insert delayed thread causes crash · e3b3f4ee
      unknown authored
      No test case, since the bug requires a stress case with 30 INSERT DELAYED
      threads and 1 killer thread to repeat. The patch is verified
      manually.
      Review fixes.
      
      The server that is running DELAYED inserts would deadlock itself
      or crash under high load if some of the delayed threads were KILLed
      in the meanwhile.
      
      The fix is to change internal lock acquisition order of delayed inserts
      subsystem and to ensure that
      Delayed_insert::table_list::db does not point to volatile memory in some 
      cases.
      For details, please see a comment for sql_insert.cc.
      
      
      sql/sql_insert.cc:
        A fix for Bug#29431 killing an insert delayed thread causes crash
        
        1) The deadlock was caused by different lock acquisition order
        between delayed_get_table and handle_delayed_insert.
        
        delayed_get_table would:
        - acquire LOCK_delayed_create
        - create a new Delayed_insert instance
        - acquire instance mutex (di->mutex)
        - "lock the instance in memory" by 
        increasing di->locked_in_memory variable
        - start the delayed thread
        - release di->mutex
        - let the delayed thread open the delayed table
        - discover that the delayed thread was killed
        - try to unlock() the delayed insert instance in memory
        - in Delayed_insert::unlock() do
         * lock LOCK_delayed_insert
         * decrease locks_in_memory and discover it's 0
         * attempt to lock di->mutex to broadcast di->cond condition <-- deadlock
         here
        
        Meanwhile, the delayed thread would
         * lock di->mutex
         * open the table
         * get killed
         * not notice that and attempt to lock LOCK_delayed_insert
        to register itself in the delayed insert list <-- deadlock here.
        
        Simply put, delayed_get_table used to lock LOCK_delayed_insert and then 
        di->mutex, and handle_delayed_insert would lock di->mutex and then 
        LOCK_delayed_insert.
        
        Fixed by moving registration in the list of delayed insert threads from 
        handle_delayed_insert to delayed_get_table - so that now
        handle_delayed_insert doesn't need to acquire LOCK_delayed_insert mutex.
        
        
        2) di->table_list.db was copied by-pointer from table_list.db of the first
        producer -- the one who initiated creation of the delayed insert thread.
        This producer might be long gone when the member is needed
        (handle_delayed_insert:open_ltable),
        e.g. by having been killed with KILL CONNECTION statement.
        Fixed by using a pointer to the consumer's deep copy of THD::db.
        
        3) In find_handler, we shouldn't assume that Delayed_insert object
        already (or still) has a table opened all the time it is
        present in the delayed insert list. E.g. it's not the case
        when Delayed_insert decided to terminate, closed the table, but haven't
        yet unregistered from the list (see the end of handle_delayed_insert).
      e3b3f4ee
  2. 18 Jul, 2007 3 commits
    • unknown's avatar
      Add a test case for Bug#22427 create table if not exists + stored · 0a66baf2
      unknown authored
      function results in inconsistent behavior.
      
      The bug itself was fixed by the patch for bug 20662.
      
      
      mysql-test/r/sp-prelocking.result:
        Update results (Bug#22427)
      mysql-test/t/sp-prelocking.test:
        Add a test case for Bug#22427 create table if not exists + stored 
        function results in inconsistent behavior
      0a66baf2
    • unknown's avatar
      A fix and a test case for Bug#26104 Bug on foreign key class constructor. · 74c8a55f
      unknown authored
      Fix the typo in the constructor. Cover a semantic check that previously
      never worked with a test.
      
      
      mysql-test/r/create.result:
        Update results (Bug#26104)
      mysql-test/r/innodb.result:
        Update results.
      mysql-test/t/create.test:
        Add a test case for Bug#26104 Bug on foreign key class constructor
      mysql-test/t/innodb.test:
        Return a new error number (MySQL error instead of internal InnoDB error).
      sql/sql_class.h:
        A fix for Bug#26104 Bug on foreign key class constructor -- fix
        the typo in the constructor
      74c8a55f
    • unknown's avatar
      Add a test case for Bug#27248 Triggers: error if insert affects temporary · 6ce19257
      unknown authored
      table.
      The bug itself is yet another manifestation of Bug 26141.
      
      
      mysql-test/r/trigger.result:
        Update results.
      mysql-test/t/trigger.test:
        Add a test case for Bug#27248 Triggers: error if insert affects temporary
        table
      6ce19257
  3. 17 Jul, 2007 1 commit
  4. 16 Jul, 2007 4 commits
  5. 15 Jul, 2007 1 commit
    • unknown's avatar
      Add a teste case for Bug#27296 "Assertion in ALTER TABLE SET DEFAULT in · 1ddd9c17
      unknown authored
      Linux Debug build (possible deadlock)"
      
      The bug is not repeatable any more.
      
      
      mysql-test/r/innodb_mysql.result:
        Update test results (Bug#27296)
      mysql-test/t/innodb_mysql.test:
        Add a teste case for Bug#27296 "Assertion in ALTER TABLE SET DEFAULT in 
        Linux Debug build (possible deadlock)"
      1ddd9c17
  6. 14 Jul, 2007 4 commits
  7. 12 Jul, 2007 7 commits
    • unknown's avatar
      Merge bk-internal.mysql.com:/home/bk/mysql-5.0-runtime · 2fad81ad
      unknown authored
      into  bodhi.(none):/opt/local/work/mysql-5.0-runtime
      
      
      sql/sql_prepare.cc:
        Auto merged
      2fad81ad
    • unknown's avatar
      Apply community contributed fix for Bug#13326 SQLPS statement logging is · a217e997
      unknown authored
      incomplete in 5.0 (and review fixes).
      
      When in 5.0.13 I introduced class Prepared_statement and methods
      ::prepare and ::execute, general logging was left out of this class.
      This was good for stored procedures, since in stored procedures
      we do not log sub-statements, but introduced a regression in case of SQL
      syntax for prepared statements, as previously we would log the actual
      statements to the log, and after the change we would log only
      COM_QUERY text.
      
      Restore the old behavior, but still suppress logging if inside a stored 
      procedure.
      
      Based on a community contributed patch from Vladimir Shebordaev.
      
      No test case since we do not have a mechanism to test output
      of the general log.
      
      
      sql/sql_prepare.cc:
        Apply community contributed fix for Bug#13326 SQLPS statement logging is 
        incomplete in 5.0 (and review fixes).
      a217e997
    • unknown's avatar
      Merge bk-internal.mysql.com:/home/bk/mysql-5.0-runtime · f68c4164
      unknown authored
      into  bodhi.(none):/opt/local/work/mysql-5.0-26141-final
      
      
      sql/sql_yacc.yy:
        Auto merged
      f68c4164
    • unknown's avatar
      A fix and a test case for Bug#26141 mixing table types in trigger · cfa185e0
      unknown authored
      causes full table lock on innodb table.
      Also fixes Bug#28502 Triggers that update another innodb table 
      will block on X lock unnecessarily (duplciate).
      Code review fixes.
      
      Both bugs' synopses are misleading: InnoDB table is
      not X locked. The statements, however, cannot proceed concurrently, 
      but this happens due to lock conflicts for tables used in triggers,
      not for the InnoDB table. 
      
      If a user had an InnoDB table, and two triggers, AFTER UPDATE and 
      AFTER INSERT, competing for different resources (e.g. two distinct
      MyISAM tables), then these two triggers would not be able to execute
      concurrently. Moreover, INSERTS/UPDATES of the InnoDB table would
      not be able to run concurrently. 
      The problem had other side-effects (see respective bug reports).
      
      This behavior was a consequence of a shortcoming of the pre-locking
      algorithm, which would not distinguish between different DML operations
      (e.g. INSERT and DELETE) and pre-lock all the tables
      that are used by any trigger defined on the subject table.
      
      The idea of the fix is to extend the pre-locking algorithm to keep track,
      for each table, what DML operation it is used for and not
      load triggers that are known to never be fired.
      
      
      mysql-test/r/trigger-trans.result:
        Update results (Bug#26141)
      mysql-test/r/trigger.result:
        Update results (Bug#28502)
      mysql-test/t/trigger-trans.test:
        Add a test case for Bug#26141 mixing table types in trigger causes 
        full table lock on innodb table.
      mysql-test/t/trigger.test:
        Add a test case for Bug#28502 Triggers that update another innodb 
        table will block echo on X lock unnecessarily. Add more test 
        coverage for triggers.
      sql/item.h:
        enum trg_event_type is needed in table.h
      sql/sp.cc:
        Take into account table_list->trg_event_map when determining
        what tables to pre-lock. 
        
        After this change, if we attempt to fire a 
        trigger for which we had not pre-locked any tables, error
        'Table was not locked with LOCK TABLES' will be printed.
        This, however, should never happen, provided the pre-locking
        algorithm has no programming bugs.
        
        Previously a trigger key in the sroutines hash was based on the name 
        of the table the trigger belongs to. This was possible because we would
        always add to the pre-locking list all the triggers defined for a table when
        handling this table.
        Now the key is based on the name of the trigger, owing
        to the fact that a trigger name must be unique in the database it
        belongs to.
      sql/sp_head.cc:
        Generate sroutines hash key in init_spname(). This is a convenient
        place since there we have all the necessary information and can
        avoid an extra alloc.
        
        Maintain and merge trg_event_map when adding and merging elements
        of the pre-locking list.
      sql/sp_head.h:
        Add ,m_sroutines_key member, used when inserting the sphead for a
        trigger into the cache of routines used by a statement.
        Previously the key was based on the table name the trigger belonged
        to, since for a given table we would add to the sroutines list
        all the triggers defined on it.
      sql/sql_lex.cc:
        Introduce a new lex step: set_trg_event_type_for_tables().
        It is called when we have finished parsing but before opening
        and locking tables. Now this step is used to evaluate for each
        TABLE_LIST instance which INSERT/UPDATE/DELETE operation, if any,
        it is used in.
        In future this method could be extended to aggregate other information
        that is hard to aggregate during parsing.
      sql/sql_lex.h:
        Add declaration for set_trg_event_type_for_tables().
      sql/sql_parse.cc:
        Call set_trg_event_type_for_tables() after MYSQLparse(). Remove tabs.
      sql/sql_prepare.cc:
        Call set_trg_event_type_for_tables() after  MYSQLparse().
      sql/sql_trigger.cc:
        Call set_trg_event_type_for_tables() after MYSQLparse().
      sql/sql_trigger.h:
        Remove an obsolete member.
      sql/sql_view.cc:
        Call set_trg_event_type_for_tables() after MYSQLparse().
      sql/sql_yacc.yy:
        Move assignment of sp_head::m_type before calling sp_head::init_spname(), 
        one is now used inside another.
      sql/table.cc:
        Implement TABLE_LIST::set_trg_event_map() - a method that calculates
        wh triggers may be fired on this table when executing a statement.
      sql/table.h:
        Add missing declarations.
        Move declaration of trg_event_type from item.h (it will be needed for 
        trg_event_map bitmap when we start using Bitmap template instead
        of uint8).
      cfa185e0
    • unknown's avatar
      Merge kpettersson@bk-internal.mysql.com:/home/bk/mysql-5.0-runtime · 92ceba28
      unknown authored
      into  adventure.(none):/home/thek/Development/cpp/mysql-5.0-runtime
      
      92ceba28
    • unknown's avatar
      Merge adventure.(none):/home/thek/Development/cpp/bug28249/my50-bug28249 · b03336cc
      unknown authored
      into  adventure.(none):/home/thek/Development/cpp/mysql-5.0-runtime
      
      
      mysql-test/t/query_cache.test:
        Auto merged
      sql/ha_myisam.cc:
        Auto merged
      sql/handler.h:
        Auto merged
      mysql-test/r/query_cache.result:
        SCCS merged
      b03336cc
    • unknown's avatar
      Bug#28249 Query Cache returns wrong result with concurrent insert / certain lock · 9a7f0fe2
      unknown authored
      A race condition in the integration between MyISAM and the query cache code 
      caused the query cache to fail to invalidate itself on concurrently inserted
      data.
      
      This patch fix this problem by using the existing handler interface which, upon
      each statement cache attempt, compare the size of the table as viewed from the 
      cache writing thread and with any snap shot of the global table state. If the
      two sizes are different the global table size is unknown and the current
      statement can't be cached.
      
      
      mysql-test/r/query_cache.result:
        Added test case
      mysql-test/t/query_cache.test:
        Added test case
      sql/ha_myisam.cc:
        - Implemented handler interface for ha_myisam class to dermine if the table
         belonging to the currently processed statement can be cached or not.
      sql/ha_myisam.h:
        - Implemented handler interface for ha_myisam class to dermine if the table
         belonging to the currently processed statement can be cached or not.
      sql/handler.h:
        - Documented register_query_cache_table method in the handler interface.
      9a7f0fe2
  8. 11 Jul, 2007 1 commit
    • unknown's avatar
      A fix and a test case for Bug#25859 ALTER DATABASE works w/o parameters. · 1ab12f15
      unknown authored
      Fix the parser to make the database options not optional.
      
      
      mysql-test/r/information_schema.result:
        Update results (Bug#25859)
      mysql-test/t/information_schema.test:
        Add a test case for Bug#25859 "ALTER DATABASE works w/o parameters"
      sql/sql_yacc.yy:
        Fix Bug#25859 ALTER DATABASE works w/o parameters - require
        parameters in the parser.
      1ab12f15
  9. 09 Jul, 2007 10 commits
  10. 08 Jul, 2007 6 commits
  11. 07 Jul, 2007 1 commit
    • unknown's avatar
      Merge olga.mysql.com:/home/igor/mysql-5.0-opt · 3c2eb9ec
      unknown authored
      into  olga.mysql.com:/home/igor/dev-opt/mysql-5.0-opt-bug29417
      
      
      mysql-test/r/type_newdecimal.result:
        Manual merge.
      mysql-test/t/type_newdecimal.test:
        Manual merge.
      3c2eb9ec