1. 17 Sep, 2010 1 commit
    • Davi Arnaut's avatar
      Bug#52419: x86 assembly based atomic CAS causes test failures · 1d520943
      Davi Arnaut authored
      The problem was that the x86 assembly based atomic CAS
      (compare and swap) implementation could copy the wrong
      value to the ebx register, where the cmpxchg8b expects
      to see part of the "comparand" value. Since the original
      value in the ebx register is saved in the stack (that is,
      the push instruction causes the stack pointer to change),
      a wrong offset could be used if the compiler decides to
      put the source of the comparand value in the stack.
      
      The solution is to copy the comparand value directly from
      memory. Since the comparand value is 64-bits wide, it is
      copied in two steps over to the ebx and ecx registers.
      
      include/atomic/x86-gcc.h:
        For reference, an excerpt from a faulty binary follows.
        
        It is a disassembly of my_atomic-t, compiled at -O3 with
        ICC 11.0. Most of the code deals with preparations for
        a atomic cmpxchg8b operation. This instruction compares
        the value in edx:eax with the destination operand. If the
        values are equal, the value in ecx:ebx is stored in the
        destination, otherwise the value in the destination operand
        is copied into edx:eax.
        
        In this case, my_atomic_add64 is implemented as a compare
        and exchange. The addition is done over temporary storage
        and loaded into the destination if the original term value
        is still valid.
        
          volatile int64 a64;
          int64 b=0x1000200030004000LL;
          a64=0;
              mov    0xfffffda8(%ebx),%eax
              xor    %ebp,%ebp
              mov    %ebp,(%eax)
              mov    %ebp,0x4(%eax)
          my_atomic_add64(&a64, b);
              mov    0xfffffda8(%ebx),%ebp      # Load address of a64
              mov    0x0(%ebp),%edx             # Copy value
              mov    0x4(%ebp),%ecx
              mov    %edx,0xc(%esp)             # Assign to tmp var in the stack
              mov    %ecx,0x10(%esp)
              add    $0x30004000,%edx           # Sum values
              adc    $0x10002000,%ecx
              mov    %edx,0x8(%esp)             # Save part of result for later
              mov    0x0(%ebp),%esi             # Copy value of a64 again
              mov    0x4(%ebp),%edi
              mov    0xc(%esp),%eax             # Load the value of a64 used
              mov    0x10(%esp),%edx            # for comparison
              mov    %esi,(%esp)
              mov    %edi,0x4(%esp)
              push   %ebx                       # Push %ebx into stack. Changes esp.
              mov    0x8(%esp),%ebx             # Wrong restore of the result.
              lock cmpxchg8b 0x0(%ebp)
              sete   %cl
              pop    %ebx
      1d520943
  2. 13 Sep, 2010 1 commit
    • Joerg Bruehe's avatar
      Selective transfer of a bugfix patch into 5.5.6-rc. · c15b344a
      Joerg Bruehe authored
      The first part is the functional change,
      the second is needed as a compile fix on Windows
      (header file order).
      
      | committer: Marc Alff <marc.alff@oracle.com>
      | branch nick: mysql-5.5-bugfixing-56521
      | timestamp: Thu 2010-09-09 14:28:47 -0600
      | message:
      |   Bug#56521 Assertion failed: (m_state == 2), function allocated_to_free, pfs_lock.h (138)
      |
      |   Before this fix, it was possible to build the server:
      |   - with the performance schema
      |   - with a dummy implementation of my_atomic (MY_ATOMIC_MODE_DUMMY).
      |
      |   In this case, the resulting binary will just crash,
      |   as this configuration is not supported.
      |
      |   This fix enforces that the build will fail with a compilation error in this
      |   configuration, instead of resulting in a broken binary.
      
      | committer: Tor Didriksen <tor.didriksen@oracle.com>
      | branch nick: 5.5-bugfixing-56521
      | timestamp: Fri 2010-09-10 11:10:38 +0200
      | message:
      |   Header files should be self-contained
      c15b344a
  3. 07 Sep, 2010 1 commit
    • Joerg Bruehe's avatar
      Fix bug#56574: · 9defb07e
      Joerg Bruehe authored
      After installation from RPM, server is run under root, not mysql user
      
      The problem was that in the cmake way of building
      the variable "MYSQLD_USER" was not set and propagated.
      In the script "mysqld_safe" its value is used as the
      name of the user who should run the server process.
      
      The fix is to explicitly set this variable to "mysql"
      and propagate it in the build process.
      It was analyzed and proposed by Jonathan Perkin. 
      9defb07e
  4. 06 Sep, 2010 2 commits
    • Dmitry Lenev's avatar
      A temporary workaround for bug #56405 "Deadlock in the · f052fa3a
      Dmitry Lenev authored
      MDL deadlock detector".
      
      Deadlock could have occurred when workload containing mix
      of DML, DDL and FLUSH TABLES statements affecting same
      set of tables was executed in heavily concurrent environment.
      
      This deadlock occurred when several connections tried to
      perform deadlock detection in metadata locking subsystem.
      The first connection started traversing wait-for graph,
      encountered sub-graph representing wait for flush, acquired
      LOCK_open and dived into sub-graph inspection. When it has
      encounterd sub-graph corresponding to wait for metadata lock
      and blocked while trying to acquire rd-lock on
      MDL_lock::m_rwlock (*) protecting this subgraph, since some
      other thread had wr-lock on it. When this wr-lock was released
      it could have happened (if there was other pending wr-lock
      against this rwlock) that rd-lock from the first connection
      was left unsatisfied but at the same time new rd-lock request
      from the second connection sneaked in and was satisfied (for
      this to be possible second rd- request should come exactly
      after wr-lock is released but before pending wr-lock manages
      to grab rwlock, which is possible both on Linux and in our
      own rwlock implementation). If this second connection
      continued traversing wait-for graph and encountered sub-graph
      representing wait for flush it tried to acquire LOCK_open
      and thus deadlock was created.
      
      This patch tries to workaround this problem but not allowing
      deadlock detector to lock LOCK_open mutex if some other thread
      doing deadlock detection already owns it and current search
      depth is greater than 0. Instead deadlock is reported.
      
      Other possible solutions are either known to have negative
      effects on performance or require much more time for proper
      implementation and testing.
      
      No test case is provided as this bug is very hard to repeat
      in MTR environment but is repeatable with the help of RQG
      tests.
      
      sql/mdl.cc:
        Moved Deadlock_detection_visitor::m_current_search_depth to
        parent class to make it available in
        TABLE_SHARE::visit_subgraph().
        Added MDL_wait_for_graph_visitor::abort_traversal() method
        which allows to abort traversal of a wait-for graph and
        report a deadlock.
      sql/mdl.h:
        Moved Deadlock_detection_visitor::m_current_search_depth to
        parent class to make it available in
        TABLE_SHARE::visit_subgraph().
        Added MDL_wait_for_graph_visitor::abort_traversal() method
        which allows to abort traversal of a wait-for graph and
        report a deadlock.
      sql/sql_base.cc:
        Added dd_owns_lock_open counter and mutex protecting it to
        track number of connections which do deadlock detection and
        own or try to acquire LOCK_open.
      sql/sql_base.h:
        Added dd_owns_lock_open counter and mutex protecting it to
        track number of connections which do deadlock detection and
        own or try to acquire LOCK_open.
      sql/table.cc:
        Workaround bug #56405 but not allowing MDL deadlock detector
        to lock LOCK_open mutex if some other thread doing deadlock
        detection already owns it and current search depth is greater
        than 0. Instead report deadlock.
      f052fa3a
    • Joerg Bruehe's avatar
      Fix bug#56547 mysql client interprets commands in comments · 9337706b
      Joerg Bruehe authored
      The problem was not caused by a change in the client,
      rather by the tests using the Windows built-in "echo"
      and not the one built by MySQL.
      This again happened because the binary was missing in the package,
      caused by the wrong macro being used to build it in "cmake".
      9337706b
  5. 02 Sep, 2010 1 commit
  6. 31 Aug, 2010 5 commits
    • Alexander Nozdrin's avatar
      Cherry-picking patch for Bug#55846. · eb129d00
      Alexander Nozdrin authored
      Original changeset:
      ------------------------------------------------------------
      revno: 3186
      revision-id: davi.arnaut@oracle.com-20100831142822-2qhufn3hho4xqr4p
      parent: gshchepa@mysql.com-20100830222201-ie7n43mjy4irlllk
      committer: Davi Arnaut <davi.arnaut@oracle.com>
      branch nick: mysql-5.5-merge
      timestamp: Tue 2010-08-31 11:28:22 -0300
      message:
        Bug#55846: Link tests fail on Windows - my_compiler.h missing
        
        Make the my_compiler.h header, like my_attribute.h, part of
        the distribution. This is required due to the dependency of
        the former on the latter (which can undefine __attribute__).
      ------------------------------------------------------------
      eb129d00
    • Alexander Nozdrin's avatar
      Cherry-picking patch for Bug#55980. · 316e9d63
      Alexander Nozdrin authored
      Original changeset:
      ------------------------------------------------------------
      revno: 3197
      revision-id: alik@sun.com-20100831135426-h5a4s2w6ih1d8q2x
      parent: magnus.blaudd@sun.com-20100830120632-u3xzy002mdwueli8
      committer: Alexander Nozdrin <alik@sun.com>
      branch nick: mysql-5.5-bugfixing
      timestamp: Tue 2010-08-31 17:54:26 +0400
      message:
        Bug#55980 Character sets: supplementary character _bin ordering is wrong
        
        Problem:
        - ORDER BY for utf8mb4_bin, utf16_bin and utf32_bin returned
          results in a wrong order, because old functions
          (supporting only BMP range) were used to handle these collations.
        - Additionally, utf16_bin did not sort supplementary characters
          between U+D700 and U+E000, as WL#1213 specification specified.
      ------------------------------------------------------------
      316e9d63
    • Alexander Nozdrin's avatar
      Cherry-picking patch for Bug#56137 from mysql-5.5-runtime. · 4283a704
      Alexander Nozdrin authored
      ```---------------------------------------------------------
      revno: 3124
      revision-id: dlenev@mysql.com-20100831090419-rzr5ktekby2gspm1
      parent: alik@sun.com-20100827083901-x4wvtc10u9p7gcs9
      committer: Dmitry Lenev <dlenev@mysql.com>
      branch nick: mysql-5.5-rt-56137
      timestamp: Tue 2010-08-31 13:04:19 +0400
      message:
        Bug #56137 "Assertion `thd->lock == 0' failed on upgrading 
        from 5.1.50 to 5.5.6".
        
        Debug builds of the server aborted due to an assertion
        failure when DROP DATABASE statement was run on an
        installation which had outdated or corrupt mysql.proc table.
        Particularly this affected the mysql_upgrade tool which is
        run as part of 5.1 to 5.5 upgrade.
        
        The problem was that sp_drop_db_routines(), which was invoked
        during dropping of the database, could have returned without
        closing and unlocking mysql.proc table in cases when this
        table was not up-to-date with the current server. As a result
        further attempt to open and lock the mysql.event table, which
        was necessary to complete dropping of the database, ended up
        with an assert.
        
        This patch solves this problem by ensuring that
        sp_drop_db_routines() always closes mysql.proc table and
        releases metadata locks on it. This is achieved by changing
        open_proc_table_for_update() function to close tables and
        release metadata locks acquired by it in case of failure.
        This step also makes behavior of the latter function
        consistent with behavior of open_proc_table_for_read()/
        open_and_lock_tables().
        
        
        Test case for this bug was added to sp-destruct.test.
      ```
      
      ---------------------------------------------------------
      4283a704
    • Alexander Nozdrin's avatar
    • Daniel Fischer's avatar
  7. 25 Aug, 2010 4 commits
    • Alexey Kopytov's avatar
      Bug#55077: Assertion failed: width > 0 && to != ((void *)0), · 04ae1aa9
      Alexey Kopytov authored
                 file .\dtoa.c
      
      The assertion failure was correct because the 'width' argument
      of my_gcvt() has the signed integer type, whereas the unsigned
      value UINT_MAX32 was being passed by the caller
      (Field_double::val_str()) leading to a negative width in
      my_gcvt().
      
      The following chain of problems was found by further analysis:
      
      1. The display width for a floating point number is calculated
      in Field_double::val_str() as either field_length or the
      maximum possible length of string representation of a floating
      point number, whichever is greater. Since in the bug's test
      case field_length is UINT_MAX32, we get the same value as the
      display width. This does not make any sense because for numeric
      values field_length only matters for ZEROFILL columns,
      otherwise it does not make sense to allocate that much memory
      just to print a number. Field_float::val_str() has a similar
      problem.
      
      2. Even if the above wasn't the case, we would still get a
      crash on a slightly different test case when trying to allocate
      UINT_MAX32 bytes with String::alloc() because the latter does
      not handle such large input values correctly due to alignment
      overflows.
      
      3. Even when String::alloc() is fixed to return an error when
      an alignment overflow occurs, there is still a problem because
      almost no callers check its return value, and
      Field_double::val_str() is not an exception (same for
      Field_float::val_str()).
      
      4. Even if all of the above wasn't the case, creating a
      Field_double object with UINT_MAX32 as its field_length does
      not make much sense either, since the .frm code limits it to
      MAX_FIELD_CHARLENGTH (255) bytes. Such a beast can only be
      created by create_tmp_field_from_item() from an Item with
      REAL_RESULT as its result_type() and UINT_MAX32 as its
      max_length.
      
      5. For the bug's test case, the above condition (REAL_RESULT
      Item with max_length = UINT_MAX32) was a result of
      Item_func_if::fix_length_and_dec() "shortcutting" aggregation
      of argument types when one of the arguments was a constant
      NULL. In this case, the attributes of the aggregated type were
      simply copied from the other, non-NULL argument, but max_length
      was still calculated as per the general, non-shortcut case, by
      choosing the greatest of argument's max_length, which is
      obviously not correct.
      
      The patch addresses all of the above problems, even though
      fixing the assertion failure for the particular test case would
      require only a subset of the above problems to be solved.
      
      
      client/sql_string.cc:
        Return an error in case of uint32 overflow in alignment.
        Also assert there was no overflow to help find such conditions
        in debug builds, since almost no callers check the return value
        of String::alloc().
      mysql-test/r/func_if.result:
        Add a test case for bug #55077.
      mysql-test/t/func_if.test:
        Add a test case for bug #55077.
      sql/field.cc:
        - Assert we don't operate with fields wider than 255 
        (MAX_FIELD_CHARLENGTH) bytes in both Field_float and  
        Field_double. 
        - Don't take field_length into account when calculating the 
        output buffer length.
        - Check the return value of String::alloc()
      sql/item_cmpfunc.cc:
        When shortcutting type aggregation, don't take the NULL 
        argument's max_length into account.
      sql/sql_string.cc:
        Return an error in case of uint32 overflow in alignment.
        Also assert there was no overflow to help find such conditions
        in debug builds, since almost no callers check the return value
        of String::alloc().
      04ae1aa9
    • Alexander Nozdrin's avatar
      Auto-merge from mysql-5.5-merge. · f6f9e3e3
      Alexander Nozdrin authored
      f6f9e3e3
    • Alexander Nozdrin's avatar
      Auto-merge from mysql-5.5-bugfixing. · 8a0e169c
      Alexander Nozdrin authored
      8a0e169c
    • Alexander Nozdrin's avatar
      0d9b6fbd
  8. 24 Aug, 2010 4 commits
  9. 23 Aug, 2010 7 commits
    • Alfranio Correia's avatar
      Post-fix push for BUG#53452. · ee07ed22
      Alfranio Correia authored
      ee07ed22
    • Evgeny Potemkin's avatar
      Bug#56120: Failed assertion on MIX/MAX on negative time value · dd1890f4
      Evgeny Potemkin authored
      The Item_cache_datetime::val_str function wasn't taking into account that time
      could be negative. This led to failed assertion.
      Now Item_cache_datetime::val_str correctly converts negative time values
      from integer to string representation.
      
      mysql-test/r/func_group.result:
        Added a test case for the bug#56120.
      mysql-test/t/func_group.test:
        Added a test case for the bug#56120.
      sql/item.cc:
        Bug#56120: Failed assertion on MIX/MAX on negative time value
        Now Item_cache_datetime::val_str correctly converts negative time values
        from integer to string representation.
      dd1890f4
    • Jon Olav Hauglid's avatar
      Bug #54332 Deadlock with two connections doing LOCK TABLE+INSERT DELAYED · 3592489c
      Jon Olav Hauglid authored
      The problem was that deadlocks involving INSERT DELAYED were not detected.
      
      The reason for this is that two threads are involved in INSERT DELAYED:
      the connection thread and the handler thread. The connection thread would
      wait while the handler thread acquired locks and opened the table.
      In essence, this adds an edge to the wait-for-graph between the 
      connection thread and the handler thread that the deadlock detector is
      unaware of. Therefore many deadlocks involving INSERT DELAYED were not 
      detected.
      
      This patch fixes the problem by having the connection thread acquire the
      metadata lock the table before starting the handler thread. This allows the
      deadlock detector to detect any possible deadlocks resulting from trying to
      acquire a metadata lock the table. If a metadata lock is successfully acquired,
      the handler thread is started and given a copy of the ticket representing the
      metadata lock. When the handler thread then tries to lock and open the table,
      it will find that it already has the metadata lock and therefore not acquire
      any new metadata locks.
      
      Test cases added to delayed.test.
      3592489c
    • Christopher Powers's avatar
      merge · 258d8928
      Christopher Powers authored
      258d8928
    • Alexander Barkov's avatar
      Bug#52121 partition by key on utf32 enum field cause debug assertion: (length % 4) == 0 · 1ed02dee
      Alexander Barkov authored
            
      Problem: ENUM columns are sorted and distributed according to their
      numeric value, but Field::hash() incorrectly passed string character set
      (utf32) in combination with numeric value to the hash function,
      which made assertion fail.
      
      Fix: pass "binary" character set in combination with numeric value
      to the hash function.
      
        mysql-test/suite/parts/r/part_ctype_utf32.result
        Adding tests
      
        mysql-test/suite/parts/t/part_ctype_utf32.test
        Adding test
      
        sql/field.cc
        Pass correct character set pointer to the hash function.
      1ed02dee
    • Sergey Vojtovich's avatar
      508104d7
    • Alexey Botchkov's avatar
      mysqlhotcopy tests fixed. · c83ff21e
      Alexey Botchkov authored
      The include/mysqlhotcopy.inc had an error in the 'if' condition, so it failed
      if the mysqlhotcopy tool was found.
      
      per-file comments:
        mysql-test/include/mysqlhotcopy.inc
              test should proceed exactly if the mysqlhotcopy was set.
        mysql-test/mysql-test-run.pl
              don't set the MYSQL_HOTCOPY variable if no mysqlhotcopy was found.
      c83ff21e
  10. 24 Aug, 2010 1 commit
  11. 23 Aug, 2010 2 commits
  12. 20 Aug, 2010 9 commits
    • Mattias Jonsson's avatar
      merge · 48c16eaf
      Mattias Jonsson authored
      48c16eaf
    • Mattias Jonsson's avatar
      post push test fix · bc05efd8
      Mattias Jonsson authored
      bc05efd8
    • Mattias Jonsson's avatar
      Bug#54747: Deadlock between REORGANIZE PARTITION and SELECT is not detected · 8df0bf13
      Mattias Jonsson authored
      The ALTER PARTITION and SELECT seemed to be deadlocked
      when having innodb_thread_concurrency = 1.
      
      Problem was that there was unreleased latches
      in the ALTER PARTITION thread which was needed
      by the SELECT thread to be able to continue.
      
      Solution was to release the latches by commit 
      before requesting upgrade to exclusive MDL lock.
      
      Updated according to reviewers comments (3).
      
      mysql-test/r/partition_innodb.result:
        updated test result
      mysql-test/t/partition_innodb.test:
        added test
      sql/sql_partition.cc:
        Moved implicit commit into mysql_change_partition
        so that if latches are taken, they are always released
        before waiting on exclusive lock.
      sql/sql_table.cc:
        refactored the code to prepare and commit
        around copy_data_between_tables, to be able
        to reuse it in mysql_change_partitions
      sql/sql_table.h:
        exporting mysql_trans_prepare/commit_alter_copy_data
      8df0bf13
    • Christopher Powers's avatar
      merge · f4cef8d3
      Christopher Powers authored
      f4cef8d3
    • Georgi Kodinov's avatar
      merge · c9d20d6c
      Georgi Kodinov authored
      c9d20d6c
    • Sergey Vojtovich's avatar
      BUG#54989 - With null_audit installed, server hangs on an · b51c8cab
      Sergey Vojtovich authored
                  attempt to install a plugin twice
      
      Server crashes when [UN]INSTALL PLUGIN fails (returns an
      error) and general log is disabled and there are audit
      plugins interested in MYSQL_AUDIT_GENERAL_CLASS. 
      
      When audit event is triggered, audit subsystem acquires interested
      plugins by walking through plugin list. Evidently plugin list
      iterator protects plugin list by acquiring LOCK_plugin, see
      plugin_foreach_with_mask().
      
      On the other hand [UN]INSTALL PLUGIN is acquiring LOCK_plugin
      rather for a long time.
      
      When audit event is triggered during [UN]INSTALL PLUGIN, plugin
      list iterator acquires the same lock (within the same thread)
      second time.
      
      Repeatable only with general_log disabled, because general_log
      triggers MYSQL_AUDIT_GENERAL_LOG event, which acquires audit
      plugins before [UN]INSTALL PLUGIN acquired LOCK_plugin.
      
      With this fix we pre-acquire audit plugins for events that
      may potentially occur during [UN]INSTALL PLUGIN.
      
      This hack should be removed when LOCK_plugin is fixed so it
      protects only what it supposed to protect.
      
      No test case for this fix - we do not have facility to test
      audit plugins yet.
      
      sql/sql_audit.cc:
        Move "acquire audit plugin" logics to a separate
        function.
      sql/sql_audit.h:
        Move "acquire audit plugin" logics to a separate
        function.
      sql/sql_plugin.cc:
        Pre-acquire audit plugins for events that may potentially occur
        during [UN]INSTALL PLUGIN.
      b51c8cab
    • Georgi Kodinov's avatar
      merge · 97e84715
      Georgi Kodinov authored
      97e84715
    • Georgi Kodinov's avatar
      merge · 7d3a9b4c
      Georgi Kodinov authored
      7d3a9b4c
    • Georgi Kodinov's avatar
      merge · 162b3837
      Georgi Kodinov authored
      162b3837
  13. 19 Aug, 2010 2 commits