1. 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
  2. 24 Aug, 2010 4 commits
  3. 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
  4. 24 Aug, 2010 1 commit
  5. 23 Aug, 2010 2 commits
  6. 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
  7. 19 Aug, 2010 5 commits
  8. 20 Aug, 2010 5 commits
    • Alexander Barkov's avatar
      Bug#55912 FORMAT with locale set fails for numbers < 1000 · 84ee0a9f
      Alexander Barkov authored
      Problems:
      - dot character was always printed as decimal point
        instead of localized decimal point for short
        numbers without thousands
      - Item_func_format::val_str always returned values in ASCII
      format,
        regargless of @@character_set_connection, which in case of utf32
        led to crash in debug build, or to incorrect values in release build.
      
      Fix:
      - Adding a piece of code to replace dot character to
        localized decimal point in short numbers.
      - Changing parent class for Item_func_format to
        Item_str_ascii_func, because its val_str() implementation is heavily ASCII oriented.
      84ee0a9f
    • Jon Olav Hauglid's avatar
      02863b41
    • Dmitry Lenev's avatar
      Fixed failure of parts.partition_debug_sync_innodb.test which · 72b228c5
      Dmitry Lenev authored
      was caused by change of thread state name from "Waiting for
      table" to "Waiting for table metadata lock" (which has 
      happened as part of fix for bug 52044 "FLUSH TABLES WITH READ
      LOCK and FLUSH TABLES <list> WITH READ LOCK are incompati").
      72b228c5
    • Jon Olav Hauglid's avatar
      Bug #55973 Assertion `thd->transaction.stmt.is_empty()' · bbaae9a2
      Jon Olav Hauglid authored
                 on CREATE TABLE .. SELECT I_S.PART
      
      This assert was triggered if an InnoDB table was created using
      CREATE TABLE ... AS SELECT where the query used an I_S table, and
      a view existed in the database. It would also be triggered for
      any statement changing an InnoDB table (e.g. INSERT, UPDATE, DELETE)
      which had a subquery referencing an I_S table.
      
      The assert was triggered if open_normal_and_derived_tables() failed
      and a statement transaction had been started. This will usually not
      happen as tables are opened before a statement transaction is started.
      However, e.g. CREATE TABLE ... AS SELECT starts a transaction in order
      to insert tuples into the new table. And if the subquery references
      an I_S table, all current tables and views can be opened in order to
      fill the I_S table on the fly. If a view is discovered, open will fail
      as it is instructed to open tables only (OPEN_TABLE_ONLY). This would
      cause the assert to be triggered.
      
      The assert was added in the patch for Bug#52044 and was therefore
      not in any released versions of the server.
      
      This patch fixes the problem by adjusting the assert to take into
      consideration the possibility of tables being opened as part of
      an I_S query. This is similar to what is already done for 
      close_tables_for_reopen().
      
      Test case added to information_schema_inno.test.
      bbaae9a2
    • Alfranio Correia's avatar
      BUG#53452 Inconsistent behavior of binlog_direct_non_transactional_updates with · ac6026ce
      Alfranio Correia authored
      temp table
                  
      This patch introduces two key changes in the replication's behavior.
                  
      Firstly, it reverts part of BUG#51894 which puts any update to temporary tables
      into the trx-cache. Now, updates to temporary tables are handled according to
      the type of their engines as a regular table.
                  
      Secondly, an unsafe mixed statement, (i.e. a statement that access transactional
      table as well non-transactional or temporary table, and writes to any of them),
      are written into the trx-cache in order to minimize errors in the execution when
      the statement logging format is in use.
                  
      Such changes has a direct impact on which statements are classified as unsafe
      statements and thus part of BUG#53259 is reverted.
      ac6026ce
  9. 19 Aug, 2010 3 commits
    • Alexander Barkov's avatar
      Bug#54916 GROUP_CONCAT + IFNULL truncates output · 7f987142
      Alexander Barkov authored
      Problem: a few functions did not calculate their max_length correctly.
      This is an after-fix for WL#2649 Number-to-string conversions".
      
      Fix: changing the buggy functions to calculate max_length
      using fix_char_length() introduced in WL#2649,
      instead of setting max_length directly
      
        mysql-test/include/ctype_numconv.inc
           Adding new tests
      
        mysql-test/r/ctype_binary.result
           Adding new tests
      
        mysql-test/r/ctype_cp1251.result
           Adding new tests
      
        mysql-test/r/ctype_latin1.result
           Adding new tests
      
        mysql-test/r/ctype_ucs.result
           Adding new tests
      
        mysql-test/r/ctype_utf8.result
           Adding new tests
      
        mysql-test/t/ctype_utf8.test
          Including ctype_numconv
      
        sql/item.h
          - Introducing new method fix_char_length_ulonglong(),
          for the cases when length is potentially greater
          than UINT_MAX32. This method removes a few
          instances of duplicate code, e.g. in item_strfunc.cc.
          - Setting collation in Item_copy properly. This change
          fixes wrong metadata on client side in some cases, when
          "binary" instead of the real character set was reported.
      
        sql/item_cmpfunc.cc
          - Using fix_char_length() and max_char_length() methods,
          instead of direct access to max_length, to calculate
          item length properly.
          - Moving count_only_length() in COALESCE after
          agg_arg_charsets_for_string_result(). The old
          order was incorrect and led to wrong length
          calucation in case of multi-byte character sets.
          
        sql/item_func.cc
          Fixing that count_only_length() didn't work
          properly for multi-byte character sets.
          Using fix_char_length() and max_char_length()
          instead of direct access to max_length.
      
        sql/item_strfunc.cc
          - Using fix_char_length(), fix_char_length_ulonglong(),
          max_char_length() instead of direct access to max_length.
          - Removing wierd condition: "if (collation.collation->mbmaxlen > 0)",
          which is never FALSE.
      7f987142
    • Alexey Botchkov's avatar
      Bug#54466 client 5.5 built from source lacks "pager" support · 2533ca9e
      Alexey Botchkov authored
                    #ifdef THREAD removed from mysql.cc.
                     No reason was found for this limitation to persist.
      
      per-file comments:
        client/mysql.cc
      Bug#54466      client 5.5 built from source lacks "pager" support
              now we have USE_POPEN always if not __WIN__
        mysql-test/r/mysql.result
      Bug#54466      client 5.5 built from source lacks "pager" support
              result updated.
        mysql-test/t/mysql.test
      Bug#54466      client 5.5 built from source lacks "pager" support
              test case added.
      2533ca9e
    • Jon Olav Hauglid's avatar
      Bug #56085 Embedded server tests fails with assert in · 41caa7f4
      Jon Olav Hauglid authored
                 check_if_table_exists()
      
      This assert was triggered when the server tried to load plugins
      while running in embedded server mode. In embedded server mode,
      check_if_table_exists() was used to check if mysql.plugin existed
      so that ER_NO_SUCH_TABLE could be silently ignored.
      The problem was that this check was done without acquiring a metadata
      lock on mysql.plugin first. This triggered the assert.
      
      This patch fixes the problem by removing the call to
      check_if_table_exists() from plugin_load(). Instead an error handler
      which traps ER_NO_SUCH_TABLE is installed before trying to open
      mysql.plugin when running in embedded server mode.
      
      No test coverage added since this assert was triggered by 
      existing tests running in embedded server mode.
      
      
      sql/sql_base.cc:
        Renamed Prelock_error_handler to No_such_table_error_handler
        and moved the declaration to sql_base.h to make it usable
        in plugin_load().
      sql/sql_base.h:
        Renamed Prelock_error_handler to No_such_table_error_handler
        and moved the declaration to sql_base.h to make it usable
        in plugin_load().
      sql/sql_plugin.cc:
        Removed call to check_if_table_exists() used to check for mysql.plugin 
        in plugin_load() for embedded server. Instead install error handler
        which traps ER_NO_SUCH_TABLE during open_and_lock_tables().
      41caa7f4